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