JS分基本类型和引用类型(原始类型和对象类型、拥有方法的类型和不能拥有方法的类型、可变类型和不可变类型)。
数据类型 | typeof |
---|---|
string | string |
number | number |
boolean | boolean |
undefined | undefined |
null | object |
function | function |
其他array,object,Set,Map等 | object |
1、基本类型
1.简单介绍
-
基本数据类型有:
null undefined number string boolean symbol
-
基本类型的值是不可以变的,任何方法都无法改变一个基本类型的值。
- 不能给基本类型添加属性和方法。
-
基本类型的比较是值的比较。
-
基本数据类型的访问是按值访问的,变量是存在栈区的(栈区指内存里的栈内存)。
- 栈区包括了变量的标识符和变量的值。
2.简单赋值
在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上,实现深拷贝。
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
基本类型
也就是说基本类型在赋值操作之后,两个变量是相互不受影响的。
2、引用类型
对象是属性和方法的集合,属性又可以包括基本类型和类型,引用类型的值是按引用访问的。
1.引用类型的值是可变的。
可以为引用类型添加或者删除属性或者方法。
var obj = new Object();
obj.name = "chenchen";
obj.gender = "female";
console.log(obj.name);//chenchen
delete obj.name;
console.log(obj.name);//undefined
2.引用类型的值是同时保存在栈内存和堆内存中的对象。
javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,引用类型的值是按引用访问的。
准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。
引用类型
3.引用类型的比较是引用的比较
var person1 = '{}';
var person2 = '{}';
console.log(person1 == person2); // true
var person1 = {};
var person2 = {};
console.log(person1 == person2); // false
引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的:
image
4.对象拷贝
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:
浅拷贝
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
3、基本数据类型转换
1.转换成string
1.a.toString()
不可以转换null和undefined
2.String(a)
都可以转换
3.隐式类型转换a+''
2.转换成number
1.Number(a)
null | 0 |
---|---|
undefined | NaN |
string-头部有数字 | 读取到数字部分 |
string-头部无数字 | NaN |
string-字符串空串或者全是空格 | 0 |
boolean | 1/0 |
2.针对字符串parseInt(a)
和parseFloat(a)
对于非string则先转换成string
var a = "123.345b";
console.log(parseInt(a),parseFloat(a)) // 123 123.345
3.隐式转换a+0 a/1 a*1 a-0 +a
3.转换成Boolean
1.Boolean(a)
null | false |
---|---|
undefined | false |
number | 除了0和NaN是false,其他都是true |
string | 除了空串,其他都是false |
object | 也会转换成true |
2.隐式类型转换!!a
4、js中的==和===
1.===
- 首先判断类型是否相等,若相等则继续比较;
- Number类型中,NaN不等于NaN,只能通过
isNaN()
来进行判定; - 其他类型遵循严格相等;
- 引用类型则要指向同一个函数或者对象;
2.==
- 若类型相等,则同===
null == undefined
- 若
number
和string
进行比较,将string
转换成number
,在进行比较。 - 若其中有
Boolean
,则转换成1或者0进行比较 - 若对象和基本类型进行比较,把对象转换成基础类型的值在进行比较,使用
toString()
和valueOf
进行比较,Date
使用的是toString()
- 其他都不相等
var obj1 = {
a : 'a',
b : 'b'
};
console.log(obj1.toString()); //[object Object]
console.log(obj1.valueOf()); //{ a: 'a', b: 'b' }
console.log(obj1=='[object Object]');//true
console.log(obj1 == "{ a: 'a', b: 'b' }");//false
console.log(null == 0); //false
console.log(Number(null)); //0
var a={a:'a'};
console.log(a.toString(),a.valueOf()); //[object Object] Object {a: "a"}
console.log(obj1=='[object Object]'); //true
var p1=p2={};
console.log(p1==p2,p1===p2); //true true
var p2={};
console.log(p1==p2,p1===p2); //false false
//valueOf()返回值为该对象的原始值。
// Array:返回数组对象本身
var array = ["ABC", true, 12, -5];
console.log(array.valueOf() === array); // true
// Date:当前时间距1970年1月1日午夜的毫秒数
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
console.log(date.valueOf()); // 1376838719230
// Number:返回数字值
var num = 15.26540;
console.log(num.valueOf()); // 15.2654
// 布尔:返回布尔值true或false
var bool = true;
console.log(bool.valueOf() === bool); // true
// new一个Boolean对象
var newBool = new Boolean(true);
// valueOf()返回的是true,两者的值相等
console.log(newBool.valueOf() == newBool); // true
// 但是不全等,两者类型不相等,前者是boolean类型,后者是object类型
console.log(newBool.valueOf() === newBool); // false
// Function:返回函数本身
function foo(){}
console.log( foo.valueOf() === foo ); // true
var foo2 = new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() );
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/
// Object:返回对象本身
var obj = {name: "张三", age: 18};
console.log( obj.valueOf() === obj ); // true
// String:返回字符串值
var str = "http://www.xyz.com";
console.log( str.valueOf() === str ); // true
// new一个字符串对象
var str2 = new String("http://www.xyz.com");
// 两者的值相等,但不全等,因为类型不同,前者为string类型,后者为object类型
console.log( str2.valueOf() === str2 ); // false
网友评论