传值与传址
基本数据类型有五种---Undefined、Null、Boolean、Number和String 引用数据类型有两种----object,array,fn
- 两种数据类型的区别:
- 存储位置不同 原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中; 引用数据类型直接存储在堆中,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后,从堆中获得实体。
- 传值方式不同 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参; 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。
说的简单点,就是
- 基本类型复制是值的复制,互相不受影响。下例中将a变量的值赋值给b变量后,因为基本类型变量是独立的所以a的改变不会影响b变量的值。
let a = 100; let b = a; a = 200; console.log(b); //100
- 对于引用类型来讲,变量保存的是引用对象的指针。变量间赋值时其实赋值是变量的指针,这样多个变量就引用的是同一个对象。
let a = { web: "你好,世界" }; let b = a; a.web = "hw"; console.log(b); // hw
undefined
- 对声明但未赋值的变量返回类型为 undefined 表示值未定义。
- 对未声明的变量使用会报错,但判断类型将显示 undefined。
- 我们发现未赋值与未定义的变量值都为 undefined ,建议声明变量设置初始值,这样就可以区分出变量状态了。
- 函数参数或无返回值是为undefined
function hw(web) { console.log(web); //undefined return web; } console.log(hw()); //undefined
null
- null 用于定义一个空对象,即如果变量要用来保存引用类型,可以在初始化时将其设置为null
var hd = null; console.log(typeof hd); //object
严格模式
- 严格模式可以让我们及早发现错误,使代码更安全规范,具有以下特点:
- 基本差异
- 变量必须使用关键词声明,未声明的变量不允许赋值
- 强制声明防止污染全局
- 关键词不允许做变量使用
- 变量参数不允许重复定义
- 单独为函数设置严格模式
function strict(){ "use strict"; return "严格模式"; } function notStrict() { return "正常模式"; }
解构差异 6. 非严格模式可以不使用声明指令,严格模式下必须使用声明。所以建议使用 let 等声明。