首先了解一下JavaScript的组成

ECMAScript是一个标准,而这个标准需要由各个厂商去实现,不同的浏览器厂商对该标准会有不同的实现。

建议使用谷歌浏览器  v8

一个完整的JavaScript实现应该由以下三个部分构成

javascript new 动态参数 javascript动态语言_javascript

 

 

JavaScript的特点

解释型语言

JavaScript是一门解释型语言,所谓解释型值语言是指不需要被编译为机器码在执行,而是直接执行。由于少了编译这一步骤,所以解释型语言开发起来尤为轻松,但是解释型语言运行较慢也是它的劣势。不过解释型语言中使用了JIT技术,使得运行速度得以改善。

动态语言

JavaScript是一门动态语言,所谓的动态语言可以暂时理解为在语言中的一切内容都是不确定的。比如一个变量,这一时刻是个整型,下一时刻可能会变成字符串了。当然这个问题我们以后再谈。不过在补充一句动态语言相比静态语言性能上要差一些,不过由于JavaScript中应用的JIT技术,所以JavaScript可能是运行速度最快的动态语言了。

类似于 C 和 Java 的语法结构

JavaScript的语法结构与C和Java很像,向for、if、while等语句和Java的基本上是一模一样的。所以有过C和Java基础的同学学习起来会轻松很多。不过JavaScript和与Java的关系也仅仅是看起来像而已。

基于原型的面向对象

JavaScript是一门面向对象的语言。啥是对象?下次聊。

Java也是一门面向对象的语言,但是与Java不同JavaScript是基于原型的面向对象。啥是原型?下次聊。

严格区分大小写

JavaScript是严格区分大小写的,也就是abc和Abc会被解析器认为是两个不同的东西。

 

数据类型

类型分类
数据类型决定了一个数据的特征,比如:123和”123”,直观上看这两个数据都是123,但实际上前者是一个数字,而后者是一个字符串。

对于不同的数据类型我们在进行操作时会有很大的不同。

JavaScript中一共有5种基本数据类型:

  • 字符串型(String)
  • 数值型(Number)
  • 布尔型(Boolean)
  • undefined型(Undefined)
  • null型(Null)

这5种之外的类型都称为Object,所以总的来看JavaScript中共有六种数据类型。

JavaScript中的堆栈

堆(heap)、栈(stack)
堆是堆内存的简称,栈是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。

js的基本类型就5种,Undefined、Null、不是new出来的布尔、数字和字符串,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。

js中其他类型的数据被称为引用类型的数据(如对象、数组、函数等),它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。

说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间。

 

 常用的es6新特性:

let && const;let 命令也用于声明对象,但是作用域为局部;iterable 类型。为了统一集合类型,ES6 标准引入了新的 iterable 类型,Array、Map 和 Set 都属于 iterable 类型,具有 iterable 类型的集合可以通过新的for … of 循环来遍历。

JS中的String常见方法有哪些

charAt()

          

var txt='hello world';   
            console.log(txt.charAt());     //h
            console.log(txt.charAt(4));    //o

  replace()

        

var txt='hello world';
            txt=txt.replace('hello','happy');
            console.log(txt)   //happy world

  split()

          

var txt='hello world';
            console.log(txt.split(''));   //按照所写内容分割
            //输出结果:['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

  indexOf()

        

var txt='hello world';
            console.log(txt.indexOf('hello'));    //0
            console.log(txt.indexOf('world'));     //6
            console.log(txt.indexOf('1'));          //-1

   lastIndexOf()

         

var txt='hello world hello world ';
            console.log(txt.lastIndexOf('hello'));   //12
            console.log(txt.lastIndexOf('world'));    //18
            console.log(txt.lastIndexOf('Hello'));   //没有找到为-1

  match()

     

var txt='hello world hello world ';
            console.log(txt.match('hello'));
            console.log(txt.match('Hello'));

  toLowerCase()

         

var txt='hello WORLD HELLO world ';
            console.log(txt.toLocaleLowerCase())

substr()

          

var txt='hello WORLD HELLO world ';
            console.log(txt.substr(3,7))    //从第三位开始往下提取个

substring()

          

var txt='hello WORLD HELLO world ';
            console.log(txt.substring(3,7))    //lo W    返回第3-7位之间的字符

 trim()

     

var txt=' hello WORLD HELLO world ';
            var aa=txt.trim();
            console.log(txt)      //之间输出
            console.log(aa)      //删除前后置空格输出

toFixed()

          

var aa=1234.72422;
            console.log(aa.toFixed(2))    //1234.72  保留两位小数

search()

        

var txt='hello WORLD HELLO world';
            document.write(txt.search(/h/))
            document.write(txt.search(/world/i))  //大小写不敏感的匹配

 

null和undefined有什么区别 

Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

js 代码

1. var oValue;  
2. alert(oValue == undefined); //output "true"

这段代码显示为true,代表oVlaue的值即为undefined,因为我们没有初始化它。

js 代码

alert(null == document.getElementById('notExistElement'));

当页面上不存在id为"notExistElement"的DOM节点时,这段代码显示为"true",因为我们尝试获取一个不存在的对象。

js 代码

1. alert(typeof undefined); //output "undefined"  
2. alert(typeof null); //output "object"

第一行代码很容易理解,undefined的类型为Undefined;第二行代码却让人疑惑,为什么null的类型又是Object了呢?其实这是JavaScript最初实现的一个错误,后来被ECMAScript沿用下来。在今天我们可以解释为,null即是一个不存在的对象的占位符,但是在实际编码时还是要注意这一特性。

js 代码

1. alert(null == undefined); //output "true"

ECMAScript认为undefined是从null派生出来的,所以把它们定义为相等的。但是,如果在一些情况下,我们一定要区分这两个值,那应该怎么办呢?可以使用下面的两种方法。

js 代码

1. alert(null === undefined); //output "false"  
2. alert(typeof null == typeof undefined); //output "false"

使用typeof方法在前面已经讲过,null与undefined的类型是不一样的,所以输出"false"。而===代表绝对等于,在这里null === undefined输出false。

==和===有什么区别?

1、对于string,number等基础类型,==和===是有区别的

(1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等

(2)同类型比较,直接进行“值”比较,两者结果一样

2、对于Array,Object等高级类型,==和===是没有区别的

进行“指针地址”比较

3、基础类型与高级类型,==和===是有区别的

(1)对于==,将高级转化为基础类型,进行“值”比较

(2)因为类型不同,===结果为false

严格模式 

js的严格模式会使得代码在严格的模式下运行,严格模式是通过 “use strict”; 开启。严格模式可以在js文件中开启严格模式,也可以对某一个函数开启严格模式。
严格模式有着如下好处:

  • 严格模式下,静默错误会报错
  • 比如不使用关键字声明变量就是一个静默错误message = "hello"
  • js引擎在执行代码时可以进行更多的优化

严格模式限制(重点):

  • 标识符不能用“保留字”命名
  • 声明变量必须要有关键字 message = “message”;
  • 不允许使用0开头作为八进制,要写成“0o开头”(0x十六进制,0o八进制,0b二进制)
  • 严格模式下“函数独立调用”函数中的this指向undefined,不会默认绑定为window
  • setTimeout传入的函数是通过apply调用this绑定为了window,在严格模式下,普通函数的this依然指向window(箭头去上层查找)

静默错误:

  • true.foo = "123";
  • NaN = 123;
  • var obj={}; Object.defineProperty(obj, "name", {writable:false, value="w"}); obj.name="1";
  • 不允许函数有相同的参数名 fn(x,x);
  • with()不允许使用
  • eval()传入字符串作为js解析如果创建了变量,不能被使用的