JS类型(1)_JS学习笔记(2016.10.02)

时间:2022-04-07 04:20:06

js类型

js中的数据类型有undefined,boolean,number,string,null,object等6种,前5种为原始类型(基本类型),基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。第6种为引用类型。

基本类型

基本类型有以下几个特点:

·基本类型的值是不可变的。任何方法都无法改变一个基本类型的值,比如一个字符串:

var name = 'jozo';

name.toUpperCase();    // 输出 'JOZO'

console.log(name);       // 输出  'jozo'

原始的name并未发生改变,而是调用了toUpperCase()方法后返回的是一个新的字符串。

·基本类型的比较是值的比较。只有在它们的值相等的时候它们才相等。但可能会这样:

var a = 'jozo';

var b = 'jozo';

console.log(a === b);        //true

在用==比较两个不同类型的变量时会进行一些类型转换。像上面的比较先会把true转换为数字1再和数字1进行比较,结果就是true了。

这是当比较的两个值的类型不同的时候==运算符会进行类型转换,但是当两个值的类型相同的时候,即使是==也相当于是===。

·基本类型的变量是存放在栈区的(栈区指内存里的栈内存)

var name = 'jozo';

var city = 'guangzhou';

var age = 22;

JS类型(1)_JS学习笔记(2016.10.02)

栈区包括了变量的标识符和变量的值。

引用类型

javascript中除了上面的基本类型(number,string,boolean,null,undefined)之外就是引用类型了,

也可以说是就是对象了。对象是属性和方法的集合。也就是说引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。

引用类型有以下几个特点:

·引用类型的值是可变的。我们可为引用类型添加属性和方法,也可以删除其属性和方法,并且是可以动态改变的。

·引用类型的值是同时保存在栈内存和堆内存中的对象。操作对象,实际上是操作对象的引用,所以引用类型的值是按引用访问的。

准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,

栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。假如有以下几个对象:

var person1 = {name:'jozo'};

var person2 = {name:'xiaom'};

var person3 = {name:'xiaoq'};

·引用类型的比较是引用的比较。

var person1 = {};

var person2 = {};

console.log(person1 == person2);   // false

引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的,所以这两个是完全不同的对象,所以返回false。

·引用类型的赋值其实是对象保存在栈区地址指针的赋值。两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:

var a = {};   // a保存了一个空对象的实例

var b = a;   // a和b都指向了这个空对象

a.name = 'jozo';

console.log(a.name);   // 'jozo'

console.log(b.name);   // 'jozo'

b.age = 22;

console.log(b.age);    // 22

console.log(a.age);    // 22

console.log(a == b);   // true

JS类型(1)_JS学习笔记(2016.10.02)

类型比较

·比较符 :==,!=,===,!==,>=,<=,>,<

== 总是试图比较他们的值,如果是基本类型,比较他们的值;如果类型不一样,总是试图作转化。

=== 比较同一性,不作转化就比较

·比较对象的转换顺序:

如果一个 object 和一个基本类型比较 , 则先调用对象的 valueOf, 再调用对象的 toString 与基本类型进行比较。也就是说先转成 number 型,再转成 string 类型。

如果是与 boolean 比较 ,先把 true 转为 1,false 转为 0 再比较。

如果两边都是数字 , 或者可以转化为数字 , 则比较数字。

如果两边都是 string , 或者可以转化为 string , 则比较 string 。

如果一边可转为 string, 一边可转为 number, 则再试图把 string 转为 number 再比较 ,如果 string 不能转为 number, 则为 NaN, 返回 false。

如果有 object 参与比较 , 则总是试图转 object 为 number 或 string 再比较。