【js重学系列】数据类型
js数据类型
数据分为基本数据类型和复杂(引用)数据类型
- 基本数据类型的特点:直接存储在栈(stack)中的数据
- 引用数据类型的特点:栈中存储的是该对象在栈中引用,真实的数据存放在堆内存里。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
JS基本数据类型有哪些?复杂数据类型有哪些?
-
在 JS 中,存在着 6 种基本数据类型,分别是:
- boolean
- null
- undefined
- number
- string
- symbol -
引用数据类型: 对象Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)
传值赋值和传值赋值
- 传值赋值:局部变量所在的栈内存会为该变量开辟一块新的内存空间,通过传来的值为内存进行初始化
- 传址赋值:通常局部变量为引用变量,(数组引用变量/类引用变量),不会在方法栈内开辟对象的内存,只会在方法栈内开辟引用变量的内存空间,直接操作的是引用变量的地址值所指向的对象
- 传值赋值不可以改变原变量的内容和地址
- 传址赋值不可以改变原变量的地址,但可以改变原变量的内容
- 根本原因:内存
- 值传递会在方法中开辟局部变量的内存,利用值传递为新开辟的局部变量初始化,局部变量有自己的地址原变量只是将值传过去了
- 引用传递不会在方法中开辟对象的内存,只是会给局部的引用变量开辟内存空间,将地址值传递给局部引用变量,但是实际的指向是堆内存
出下面运行的结果,解释原因。
-
function test(person) { person.age = 26 person = { name: 'hzj', age: 18 } return person } const p1 = { name: 'fyq', age: 19 } const p2 = test(p1) console.log(p1) // -> ? console.log(p2) // -> ?
-
p1:{name: “fyq”, age: 26} p2:{name: “hzj”, age: 18}
-
原因: 在函数传参的时候传递的是对象在堆中的内存地址值,test函数中的实参person是p1对象的内存地址,通过调用person.age = 26确实改变了p1的值,但随后person变成了另一块内存空间的地址,并且在最后将这另外一份内存空间的地址返回,赋给了p2。
null是对象吗?为什么?
结论: null不是对象。
解释: 虽然 typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象然而 null 表示为全零,所以将它错误的判断为 object 。
```
toString
valueOf
- https://www.cnblogs.com/xiaohuochai/p/5560276.html
- https://blog.csdn.net/celi_echo/article/details/100038366
typeof
-
1. 对于原始类型来说,除了 null 都可以调用typeof显示正确的类型 typeof 1 // 'number' typeof '1' // 'string' typeof undefined // 'undefined' typeof true // 'boolean' typeof Symbol() // 'symbol' typeof null // 'object' 2. 但对于引用数据类型,除了函数之外,都会显示"object"。 typeof [] // 'object' typeof {} // 'object' typeof console.log // 'function' 3. 因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true 4. 如果是null 则返回object 5. https://blog.csdn.net/qq_38722097/article/details/80717240
-
1. typeof 一般被用于判断一个变量的类型 2. 我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型 3. 在判断不是 object 类型的数据的时候,typeof能比较清楚的告诉我们具体是哪一类的类型 4. typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object typeof是一个运算符,有2种使用方式:typeof(表达式)和typeof 变量名,第一种是对表达式做运算,第二种是对变量做运算。
instanceof
-
核心: 原型链的向上查找。(右侧构造函数指向的原型对象是否存在于左侧实例对象的原型链上)
-
function myInstanceof(left, right) { //基本数据类型直接返回false if(typeof left !== 'object' || left === null) return false; //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象 let proto = Object.getPrototypeOf(left); while(true) { //查找到尽头,还没找到 if(proto == null) return false; //找到相同的原型对象 if(proto == right.prototype) return true; proto = Object.getPrototypeof(proto); } }
Object.is和===的区别?
-
Object在严格等于的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。 Object.is() 方法判断两个值是否是相同的值。表示两个参数是否相同的布尔值 。
== 和 ===有什么区别?
-
1. ===叫做严格相等,是指:左右两边不仅值要相等,类型也要相等,例如'1'===1的结果是false,因为一边是string,另一边是number。 2. ==不像===那样严格,对于一般情况,只要值相等,就返回true,但==还涉及一些类型转换,它的转换规则如下: 1. 两边的类型是否相同,相同的话就比较值的大小,例如1==2,返回false 2. 判断的是否是null和undefined,是的话就返回true 3. 判断的类型是否是String和Number,是的话,把String类型转换成Number,再进行比较 4. 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较 5. 如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较
Object.prototype.toString()
1. ```js
var obj=new Object({a:3})
// console.dir(obj);
// console.dir(['obj'].toString());
// console.dir(obj.toString===Object.prototype.toString);
console.dir(obj.toString===Object.prototype.toString);
console.log(obj.toString());
// console.log(Object.prototype.toString.call(1));
```
2.
3.
JS中类型转换有哪几种?
1. 转换成数字
2. 转换成布尔值
3. 转换成字符串
http://47.98.159.95/my_blog/015/type.jpg
https://www.jianshu.com/p/7cb41d109b7e
https://www.cnblogs.com/xiaohuochai/p/5557387.html
https://blog.csdn.net/aliven1/article/details/111644780
https://www.jianshu.com/p/f903b42812e4
强制类型转换
1. String(),Number(),Boolean()
隐式转换
1. 每个对象的toString和valueOf方法都可以被改写,每个对象执行完毕,如果被用以操作JavaScript解析器就会自动调用对象的toString或者valueOf方法
[] == ![]结果是什么?为什么?
1. ```
①、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
②、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
③、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
```
2. https://blog.csdn.net/magic_xiang/article/details/83686224
{}==!{}
1. ```
{} == !{} ->
{} == false ->
{} == Number(false) ->
{} == 0 ->
({}).toString() == 0 ->
[Object Object] == 0 ->
false
```