javascript权威指南-数据类型笔记
原始值与应用值
1.原始值类型数据室不可变的 (改变原始值类型数据, 返回的是一个新的对象)
var str0 = 'test';
var str1 = str.replace('t', 'a');
alert(str1); // 输出 'aest'
alert(str0); // 输出 'test'
2.应用值类型是可变的(他的值是可以修改的)
// 对象直接量
var o = {x:1, y:2, z:3};
console.log(o); // 输出 Object { x=1, y=2, z=3}
o.z = 4;
console.log(o); // 输出 Object { x=1, y=2, z=4}
// 数组直接量
var arr = [1, 2, 3];
console.log(arr) // 输出 [1,2,3]
arr[2] = 4;
console.log(arr) // 输出[1, 2,4]
几个知识点
1.javascript是ECMAscript的实现,其组成部分有:
2. 原始类型与引用类型(以下是w3school的解释很清晰)
原始值: 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
引用值: 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
(*在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。)
3.javascript变量声明及作用域
1).js中变量声明有如下几种(分为 使用关键字var , 不使用关键字var)
//------------------------------------------//
// 分别用var声明
var a;
var b;
a = 'hello';
b = 'world';
// 单var声明
var a, b;
// 单var 声明并赋值
var a = 1,
b = 2,
c;
//------------------------------------------//
// 不使用var声明
g = 'test'; // 需要注意的是这种不用var声明变量 直接赋值的方式, 在任何地方使用都会被视作全局对象的属性, 可以使用delete删除, 但是不推荐这种用法(EC5严格模式下报错)
2).js中变量的作用域分为全局作用域()和局部作用域(由函数function构成)俩种
(** js引擎执行时, 每进入一个作用域(环境), 会根据当前上下文, 创建一个针对该环境的上下文对象,在这个阶段,variableObject对象,作用域链,以及this所指向的对象都会被确定推荐阅读)
4. 对象的比较,即使俩个对象包含同样的属性及同样的值, 他们也是不相等的( 各个索引完全相等的两个数组也不相等)
对象的比较是引用的比较,当且仅当他们引用同一个对象时, 它们才相等
(这个好比现实中 有姓名相同和年龄相同但是不是同一个人, 但是如果这个人还有个小名(其它引用)那么这个小名和他的大名就都指他一个人了)
var o1 = {name:'zhang', age:23};
console.log(o1); // 输出Object { x=1, y=1}
var o2 = {name:'zhang', age:23};
console.log(o1); // 输出Object { x=1, y=1}
console.log( o1 === o2 ); // 输出false
var o3 = o1;
console.log(o3); // 输出Object { x=1, y=1}
console.log( o3 === o1 ); // 输出true