Open YvetteLau opened 5 years ago
1、es5定义了5种基本类型,Null、Undefined、Boolean、String、Number,es6新增了Symbol。 2、虽然 typeof null === 'object' 为true,但是null 不是对象,属于基本类型的一种。 3、基本数据类型是值拷贝,复杂数据类型是引用拷贝
1、一共有六种,null、undefined、number、Boolean、string、symbol,其中symbol为es6新增。 2、null通过typeof打印是对象。 3、基本数据类型存在栈中,直接存入的是值。复杂数据类型在栈中存入的是地址,该地址指向堆内存,在堆内存存入的是具体值。因此,在拷贝时,基本数据类型拷贝的是具体值,而复杂数据类型拷贝的指向堆内存的引用地址。
1.基本数据类型(5种):null、undefined、number、Boolean、string(es6新增symbol) 2.null是对象 3.基本数据类型把数据名和值直接存储在栈当中,复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值
1,js中有6中数据类型:string,boolean,number,null,undefined,object,ES6新增了symbol。 2,null本身不是对象,typeof null === 'object’,是语言本身的一个bug。其原理是不同的对象在底层都是用二进制来表示的,在js中二进制前3位是0即判断是为对象,null的二进制表示是全0,即前三位都是0,所以执行typeof返回的是object,实际上null为基本数据类型。 3,(1)基本数据类型的值存在栈中,复杂数据类型在栈中存的是地址,其真正的值存在堆中。 (2)当基本数据类型作为参数传给函数时,函数对其改变不会改变外面的值,复杂数据类型作为参数时,函数内部对参数值的修改会改变外部变量的值。
1,Number,Boolean,String,Symbol,Undefined,Object,null一共7种; 2,typeof(null) ===> 'object' 3.引用类型 存在与堆中地址中,基本类型存在与栈当中;就相当于C语言里面的指针
基本数据类型:Number, Boolean, String, Undefined, Null,es6多一个Symbol
null不是一个空引用,而是一个原始值。typeof null返回object似乎是历史遗留的bug😂
基本数据数据类型存储在栈,存储的是值;复杂数据类型的值存储在堆,地址存储在栈。所以在赋值的时候实际上复制的是地址,指向同一个内存空间;当一个对象改变时,另一个也会改变
1.基本数据类型:Symbol, String, Number , Undefined, Null, Boolean 2null为一个对象,可以用typeof null || Object.prototype.toString(null) 测试 3区别:在拷贝时,基本数据类型直接拷贝内容,复杂数据类型拷贝引用地址
1.js中有5种数据类型:Undefined、Null、Boolean、Number和String。 2.NULL:代表声明了一个空对象,不是一个字符串,可以赋给任何对象 3.基本数据类型把数据名和值直接存储在栈当中 复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值
string、number、undefined、null、object、symbol。 null不是一个对象而是一个原始值。 基本数据类型的值存储在栈内存里,而复杂类型的的地址存储在栈内存,值存储在堆内存。
1.基本数据类型:Number, String, Undefined,Null ,Boolean es6新增Symbol 2null 不是一个对象 虽然typeof 判断返回一个对象 区别:基本类型 在创建是 会在栈上画出一块内存 将数值直接存到栈上 引用类型 在创建是 首先会在栈上给他引用分配一块空间 尔对象的具体信息存在堆内存里 然后根据栈的上的指针指向堆中的对象地址 也就是查询
基本数据类型有: String, Number,Boolean, undefined, null 引用数据类型有: object,function null 是对象 理解基本数据类型,和引用数据类型为 基本数据类型值 存放于栈内存中 引用数据类型 内存存放于堆内存中 只是向栈中保留一个指针 根据指针去取。
除 Object 以外的所有类型都是不可变的(值本身无法被改变)。
鱼头注:在最新的ECMA proposal里有个处于Stage 3的基本数据类型 BigInt
,用于表示比253大的所有数字。
具体可参考:
https://tc39.github.io/proposal-bigint/#sec-bigint-objects
在ECMA文档里的定义是:
原始值,表示缺省任何对象值(object value)
typeof null === 'object'
是个早在第一版的 JS 就存在的 BUG。在这个版本里,JS 值是以 32位 为单位存储的,由 小型标记(1 - 3位) 和 真实值 组成。类型标签存储在低位的单元里。其中5个是:
000
:对象(object)1
:整型(int)010
:双精度浮点型(double)100
:字符串(string)110
:布尔值(boolean)两种特殊值
undefined
(JSVAL_VOID
):-2的30次方以内的整数。null
(JSVAL_NULL
) :机器码 NULL
空指针,空指针引用 加上 对象标记还是 0,所以有 Number(null) === 0
跟 typeof null === 'object'
。JS的复杂类型只有 Object
一种。
在计算机科学中, 对象是指内存中的可以被 标识符引用的一块区域。
在 Javascript 里,对象可以被看作是一组属性的集合。用 对象字面量语法 来定义一个对象时,会自动初始化一组属性。而后,这些属性还可以被增减。属性的值可以是任意类型,包括具有复杂数据结构的对象。属性使用键来标识,它的键值可以是一个字符串或者符号值 (Symbol)。
基本类型存储的是值,复杂类型存储的是地址(指针)。
当你创建了一个复杂类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。
当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),当我们进行数据修改的时候,就会修改存放在地址(指针) 上的值。
基本类型有5种 null.undefined.string.number.booleen es6新增symbol类型 通过typeof null返回object验证null是一个对象 基本类型储存在栈中,复杂类型储存在堆中,通过栈中保存的堆地址取值
1:JS中基本数据类型 Undefined 、Null、Boolen 、Number、 String、Symbol(ES6新增), Object是 复杂数据类型 2:null不是一个对象,通过typeof可以检测是object ,但,它是一个空对象指针,如果一个对象准备保存值时,初始化时最好用null, 另外:undefined派自生于null。 3: 基本数据类型: 1:基本数据类型的值是不可变的 ,改变的是值的指针指向。 2:不可添加属性和值; 3:值存在栈中 4:赋值是简单的赋值 5:比较时候比较的是值的比较
复杂数据类型(引用数据类型): 1:值是可以变的, 2:可以添加属性和值 3:存在堆和栈中,堆存出的是值,栈存储的变量名和堆的引用 4:赋值是对象的引用 5:比较 的时候比较的是对象的引用的比较
1.JS的基本数据类型:Undefined、Null、Boolean、Number、String
Undefined类型只有一个值,即特殊的undefined,声明变量但是没有初始化,这个变量的值就是undefined
Null类型只有一个值null,表示一个空对象指针,正式使用typeof操作符检测null会返回object
Boolean有两个字面值:true和false
Number:用来表示整数和浮点数,还有一种特殊的值即NaN,这个数值用来表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。
2.三大引用类型
Object类型
Array类型
Function类型
3.区别 存储空间:基本类型存在栈中,引用类型存在栈上
值传递:基本类型传递的是值,引用类型传递的是地址(引用)
作为函数的参数:基本类型传递的是值,引用类型传递得是地址 4.null是对象 指的是空指针。tryeof(null)object
JS基本数据类型分为基本类型和引用类型
基本类型有如下几种:
- null
- undefined
- string
- number
- boolean
- symbol 引用类型
- object
null是对象吗? 虽然typeof null === 'object' 但是null并不是对象,这是一个历史遗留问题,浏览器没有修复。如果使用instanceof 操作符, null instanceof Object 会返回 false
基本数据类型和复杂类型的区别 基本类型存储在栈内存中,如果把一个基本类型的变量赋值给另一个变量实际上进行的是值拷贝。引用类型的指针(地址)存储在栈内存中,这个指针指向的对象存储在堆内存中,如果进行拷贝拷贝的是栈内存中存储的指针而不是对象真正的值
JS中基本数据类型有哪几种?null 是对象吗?基本数据和复杂数据类型有什么区别?
Sybmol表示独一无二的值
BigInt可以表示任意精度的整数,在数字末尾加上一个n表示BigInt类型
const b = 123456789n;
使用typeof
可以判断类型,得到的是对应类型的字符串
typeof undefined == 'undefined' // true
typeof null == 'object' // true
typeof '42' == 'string'
typeof 42 == 'number'
typeof true == 'boolean'
typeof Symbol() == 'symbol'
null不是对象,null不是引用类型,虽然
typeof null === 'object'
但是null不是一个对象,仍然是一种基本类型。
答一: 5种基本数据类型:Number, String, Boolean, Undefined, Null; 3种引用类型:Array, Object, Function。
答二: Null是空对象,空对象也是对象,永远只有一个值,那就是Null。
答三:区别 基本数据类型之间的赋值,相当拷贝,栈内存中会同时存在两份数据,修改其中任意一个数据,另一个数据不会变化; 引入数据类型之间的赋值,是改变指针的指向,共享一份数据;
1、JS的基本数据类型有:undefined,null,number,string,Boolean ,Symbol 2、null不是对象。
从逻辑上看,null值表示一个空对象指针,这就是为什么使用typeof操作符检测null值时会返回‘object’的原因,也是JavaScript遗留下来的bug。 而真正的原因是:JS类型值是存在32bit 单元里,为了性能考虑用低位储存了变量的类型信息,其中000表示是Object类型,而null对应机器码的NULL指针,一般全为零,所以typeof(null)为Object。
null instanceof Object //false
3、基本数据类型和复杂数据类型有什么区别?
基本数据类型值指的是简单的数据段,而复杂的数据类型值是由一个或多个值构成的对象。
基本数据类型拷贝时,拷贝的是值,并且原变量和拷贝后的变量是相互独立的,这两个变量可以参与任何操作而不会相互影响。 复杂数据类型拷贝时,也就是所说的引用类型的值拷贝时,副本拷贝的是指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用的是同一个对象,因此,改变其中一个变量,就会影响另一个变量。
传递参数时,道理和拷贝一样。在向参数传递基本类型的值时,被传递的值会被赋值给一个arguments对象中的一个元素(即局部变量);在向参数传递引用类型的值时,会把对应值的地址复制给一个局部变量,因此局部变量的变化会反映到函数的外部。
当我们用 typeof null时, 会输出object, 这是因为在JS 最初的版本中,
000
开头代表对象, 而null
表示为全0
, 所有将其错误的判断为object
, 即使后来内部的判断规则改变了, 这个bug 还是流传下来啦
typeof
可以正确判断除了null
其他的所有基本类型, 而判断复杂数据类型,我们建议使用instanceof
目前,JS原始类型有六种,分别为:
ES10新增了一种基本数据类型:BigInt
复杂数据类型只有一种:
null 不是一个对象,尽管 typeof null
输出的是 object
,这是一个历史遗留问题,JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,null
表示为全零,所以将它错误的判断为 object
。
1.内存的分配不同
基本数据类型存储在栈中。
复杂数据类型存储在堆中,栈中存储的变量,是指向堆中的引用地址。
2.访问机制不同
3.复制变量时不同
let b = {
age: 10
}
let a = b;
a.age = 20;
console.log(a); //{ age: 20 }
4.参数传递的不同(实参/形参)
函数传参都是按值传递(栈中的存储的内容):基本数据类型,拷贝的是值;复杂数据类型,拷贝的是引用地址
//基本数据类型
let b = 10
function change(info) {
info=20;
}
//info=b;基本数据类型,拷贝的是值得副本,二者互不干扰
change(b);
console.log(b);//10
//复杂数据类型
let b = {
age: 10
}
function change(info) {
info.age = 20;
}
//info=b;根据第三条差异,可以看出,拷贝的是地址的引用,修改互相影响。
change(b);
console.log(b);//{ age: 20 }
基本数据类型
引用数据类型
null不是一个对象,它只是用来保存对象,还没有真正的保存值,所以说它是一个空对象指针 即使
typeof null // object
可是它也
typeof [] // object呢
基本数据类型: 存放在栈内存中,它们是按值存放的 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的
这道题可以引出另外一个问题,浅拷贝和深拷贝
A1
基本数据类型
- number
- string
- boolean
- undefined
- null
- symbol
引用数据类型
- function
- object
- array
A2
null不是一个对象,它只是用来保存对象,还没有真正的保存值,所以说它是一个空对象指针 即使
typeof null // object
可是它也
typeof [] // object呢
A3
基本数据类型: 存放在栈内存中,它们是按值存放的 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的
这道题可以引出另外一个问题,浅拷贝和深拷贝
O(∩_∩)O哈哈~赞~ 深拷贝和浅拷贝后面的issue中会有~~~ 比如深拷贝和浅拷贝的区别是什么?如果实现一个深拷贝~
以最新ES6标准: 基本类型: String,Number,Boolean,null,undefined,Symbol
typeof null === 'object' ---> null属于对象
此处延伸一下对null的理解: null与undefined相似,表示一个空值,即此处的值为空,调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。
基本类型因数据量小存储于栈中,复杂数据类型因数据量可扩展而存储于堆中。 通常声明的复杂数据类型实际上只是一个指针,相当于宾馆的房间号,仅仅表示该声明指向这个房间。所以会引发浅拷贝/深拷贝的情况,而基本类型不会发生这种情况 ---tl
Number, String, Boolean, Null, Undefined, Symbol
原始数据类型 (不是对象且没有方法)
Boolean、Null、Undefined、Number、String、Symbol(ES6 新增)、BigInt(ES10)
复杂数据类型 Object (emm 这个内容太多了)
不是。null 值表示缺少的标识,指示变量未指向任何对象。
The value null is written with a literal: null. null is not an identifier for a property of the global object, like undefined can be. Instead, null expresses a lack of identification, indicating that a variable points to no object.
基本数据类型: 存放在栈内存中,它们是按值存放的 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的 在变量赋值或函数传参时,数据传递的方式会有不同,基本类型是复制一份值进行传递,引用类型则是传递了内存地址。
今天的答案真早啊,给刘小夕打call
JS的基本数据类型:null string number Symbol undefined boolean 对象类型 object null 不是对象 检测null 是不是对象 typeof 检测不出来,用instanceof 原因:在JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息,000开头的是对象,null是全0,所以将null误判为Object了,虽然现在的内部类型判断代码已经改变了,但bug永久的遗留下来了 eg: var srt = null console.log(srt instanceof Object)//false 说明不是对象 基本数据类型和复杂数据类型区别: 基本数据类型把数据名和值直接存储在栈当中, 复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值 基本数据类型作为参数时,函数内部对参数值的修改不会改变外部变量的值 因为复杂数据类型赋值是把栈中对象的地址赋给变量,函数内外两个变量指向同一个对象,所以只要对象的属性值改变,两个变量值都会改变 eg: function student(age, name, grade) { this.age = age; this.name = name; this.score = grade; } var s1 = new student(18, "yz", 100);//创建一个student对象 function a(s) { s.name = "hello"; } a(s1)//把s1赋给s console.log(s1.name);//输出hello
-----给小姐姐打call
boolean string number null undefined 以及新增的symbol
区别是:基本数据类型存在栈里面,复杂数据存在堆里面,需要访问堆里面的数据,是去栈里面获取地址,根据地址去堆里面查找
打卡,感谢大佬们的答案,学习了
1.7种语言类型:Number String Boolean Null Undefined Symbol Object 2.null表示空值,null不是一个对象,它只是用来保存对象,还没有真正的保存值,所以说它是一个空对象指针(学习了) 3.基本类型存在栈中,引用类型存在栈上;基本类型传递的是值,引用类型传递的是地址
JS中基本数据类型有哪几种? JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object) 基本类型有六种: null,undefined,boolean,number,string,symbol
null 是对象吗?
基本数据和复杂数据类型有什么区别? 基本数据类型把数据名和值直接存储在栈当中 复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值 参考文档:https://www.cnblogs.com/alenhx/p/9048144.html
1、es5定义了5种基本类型,Null、Undefined、Boolean、String、Number,es6新增了Symbol,复杂数据类型Array,object,function. 2、虽然 typeof null === 'object' 为true,但是null 不是对象,属于基本类型的一种。 3、基本类型的值存储在栈里面,复杂类型的值存储在堆里面。基本类型复制的是值,引用类型复制的是地址。
基本数据类型:number
string
boolean
undefined
null
Symbol
一共6种,其中 Symbol
为ES6新增的基本类型
null不是一个对象,值null
只是一个字面量,表示一个空对象指针,它不指向任何对象,前面已经有小伙伴说的很详细了,就不再说
基本数据类型的值存储在栈中,而复杂数据类型(引用类型)在栈中只是保存的一个地址,它真正的值是保存在堆内存中,访问这个数据其实是通过栈中保存的地址去堆中寻找真正的值
变量的重新赋值
//基本类型
var a = '123';
var b = a;
//引用类型
var c = {name:'张三'};
var d = c;
c.name = 'lisi'
/*
基本类型a 在栈中保存的值就是 123,然后把a的值赋值给b的时候是直接把 123 赋值给b
引用类型 c在栈中保存的是堆中{name:'张三'}的地址(比如为0001) 然后把c的值赋值给d实际上是把这个地址0001赋值给了变量d
c和d指向的是同一个空间地址 ,这时候修改对象的属性值同样也会反映到d上,因为他们都是指向同一个家伙,只是观看(获取)的角度不一样而已
*/
function foo(s,o){
s = '456';
o.name = 'lisi'
}
var str = '123'; var obj = {name:'zhangsan'} foo(str,obj); console.log(str);//123 console.log(obj);//{name:'lisi'} //函数调用时,实参传递给形参 str->s, obj->o;str为基本类型 传递给o的值就是str的实际值 123,而 obj传递给o的值实际上只是一个空间地址,这个地址指向堆内存的{name:'zhansan'},也就是此时 o 和 obj 指向的是同一个对象
### CommonJs 和 ES6 对模块读取操作
都说 CommonJs 是值得拷贝,而 ES6采用值的引用,下面我们看一个简单的例子
* CommonJs
```js
//b.js
let count = 1;
let obj = {
name:'zhangsan'
}
module.exports = {
count,
obj,
addCount(){
count++;
},
getCount(){
return count;
},
changeObj(){
obj.name = 'lisi'
},
getObj(){
return obj;
}
}
//a.js
const {count,obj,addCount,getCount,changeObj,getObj} = require('./b');
console.log(count);//1
addCount();
console.log(count);//1
console.log(getCount());//2
console.log(obj);//{name:'zhangsan'}
changeObj();
console.log(obj);//{name:'lisi'}
console.log(getObj());//{name:'lisi'}
通过测试可以发现 CommonJS规范 跟上面我们说的基本类按值传递 ,引用类型按地址传递是一致的 所以说 CommonJS 说是按值得拷贝(对于对象拷贝得是指向堆内存中得地址)
//b.js
export let count = 1;
export let obj = {
name:'zhangsan'
}
export function addCount(){
count++;
}
export function getCount(){
return count;
}
export function changeObj(){ obj.name = 'lisi'; } export function getObj(){ return obj; }
```js
//a.js
import {count,obj,addCount,getCount,changeObj,getObj} from './b.js';
console.log(count);//1
addCount();
console.log(count);//2 由于上一步count +1 这里按照引用 打印出来得值为2
console.log(getCount());//2
console.log(obj);//{name: "zhangsan"}
changeObj();
console.log(obj);//{name: "lisi"}
console.log(getObj());//{name: "lisi"}
console.log(getObj() === obj);//true
//count = 33;// error ReferenceError: count is not defined
由此可见 ES6规范 无论是基本类型 还是 引用类型 都是按照值得引用来传递
注意:es6中 引用的变量是只读模式,你不能对他的引用地址重新赋于新的遍历 否则会报错 ReferenceError: count is not defined
JS中的基本数据类型有String,Number,Boolean,Null,Undefined,Symbol var a='Hello'; var a=1.08; var a=true; Undefined表示变量声明了,却没有被赋值 可以通过将变量的值设为null来清空变量
console.log(typeof null);// object
复杂数据类型 Object Array
基本数据类型把变量名和值都存在栈中 复杂数据类型在栈中存储变量名和一个堆的地址,在堆中存储属性名和属性值,访问时先从栈中 取堆的地址,然后在从堆中拿相应的值
基本数据类型 function fn(a){ a='Hello'; return a; } var b='Hi'; console.log(fn(b)); //'Hello' console.log(b);// 'Hi' 基本数据类型当做参数传入函数,原值不会被修改
复杂数据类型 function Person(name,age){ this.name=name; this.age=age; }
var person1=new Person('Jodie','18');
function change(person){ person.name='Jim'; }
change(person1); console.log(person1.name); //'Jim' 复杂数据类型当做参数传入函数,属性值被修改,person1的地址没有被修改,但是person1的值被修改了
1.JS中基本数据类型有哪几种? 最新的 ECMAScript 标准定义了 7 种数据类型: 6种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number、String.Symbol类型(ES6新增) 1种复杂数据类型:Object
主要说一下这两个:
Unndefined类型:该类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。无论在什么情况下都没有必要把一个变量的值显式地设置为undefined。
Null类型:该类型同样只有一个值,即null。从逻辑角度来看,null表示一个空指针对象,而这也正式使用typeof操作符检测null值时会返回object的原因。事实上,undefined值是派生自null值的。
2.基本数据和复杂数据类型有什么区别?
基本类型值:指的是保存在栈内存中的简单数据段; 引用类型值(复杂数据类型):指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值;
两种访问方式
基本类型值:按值访问,操作的是他们实际保存的值; 引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值;
两种类型复制
基本类型变量的复制: 从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上,改变源数据不会影响到新的变量(互不干涉); 引用类型变量的复制: 复制的是存储在栈中的指针,将指针复制到栈中为新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个;
js中基本数据类型有 :string number null undefined boolean 以及es6 中的 Symbol
null 不是对象,需要注意的是typeof null返回为object,因为特殊值null被认为是一个空的对象引用
基本数据类型与引用数据类型的区别
基本数据类型是存储在栈内存,存储的是值而复杂数据类型的值存储在堆内存,地址存储在栈内存。当我们把对象赋值给另外一个变量的时候,复制的是地址,指向同一块内存空间,当其中一个对象改变时,另一个对象也会变化。
基本数据类型null undefined number string Boolean
null值表示一个空对象指针,它代表的其实就是一个空对象,所以使用typeof操作符检测时返回"object"
基本数据类型把数据名和值直接存储在栈当中 复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值,访问时先从栈中获取地址,再到堆中拿出相应的值
js基本数据类型有undefined、null、Boolean、Number、String,es6新增了基本数据类型Symbol。 null准备用来保存对象,但还未真正保存对象,表示一个空对象指针。 基本数据类型保存在栈内存,做‘=’操作时,是在栈中复制了一个值;复杂数据类型真正的值保存在堆内存,栈内存保存着值的引用。做‘=’操作时,是在栈内存复制了一个引用,所以改变一个复杂类型数据的值时,另一个复制的对象的值也会改变。
js的原始数据类型有7种
尽管typeof null
输出的是object
,但这其实是个历史遗留问题,不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判为object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof
时会返回obkect
,这个bug是第一版的JavaScript中留下来的。这个版本中,数值是以32字节存储的,由标志位(1-3个字节)和数值组成,000是对象的标志位。
javascript数据类型及基本类型与复杂类型的区别: 1.值类型(基本类型):undefined、String、Boolean、Number、null(对象)、Symbol
引用类型(复杂类型 ):Array、Object、Function 3.typeof不能区分引用类型(Function除外),用instanceof来判断 4.NAN是一个特殊的number 5.值类型存储在栈中,引用类型存储在堆中。引用类型作为函数参数时,传递的是内存地址,函数内修改属性的对象是函数外部创建的对象。这是引用类型的本质所在。 `function pInfo(obj){
obj.name = '深圳'; }
var city = new Object(); city.name = '杭州'; city2 = city; pInfo(city2); console.log(city2); console.log(city); `
基本数据类型:string、boolean、number、null、undefined、symbol(es6)、BigInt(es10) 区别:基本数据类型保存在栈当中,复杂类型数据存放在堆和栈当中,栈当中存放复杂类型数据的地址(指针),堆当中存放复杂类型的值;基本数据类型赋值是值传递,复杂类型数据赋值是地址传递,指向同一块内存空间,所以改变其中一个值时另一个值也会改变 null:typeof null返回Object,会误以为null是对象,这其实是js的一个BUG啦!!!typeof非常善于区分不同类型的原始值,并区分他们和对象,但是在区分不同类型的对象以及null时却完全没用。但是js作为一门强大的语言,Object.protoType.toString.call(null)返回[bject, null]给了我们最终的答案,所以,null不是对象,它只是一个基本数据类型
null boolean undefined string number null 不是对象 基本数据是值传递,改变后面的值,不影响前面 复杂数据类型是把前者的地址赋给后者,改变任何一个的值,两个都会一起改变
1.基本类型6中:string,number,boolean,null,undefined,symbol(es6) 2.引用数据类型:Object 区别:引用数据类型传递的是地址值,指向同一块内存空间。其中一个修改,会影响其他相同指向的对象 基本类型是值传递。互不相干 另外:Object.prototype.toString().call()这个方式可以用来判定对象 typeof null是个bug,返回的Object,实际上null是基本类型。(js底层根据二进制判断,前三位为0则为对象,null全是0.)
基础数据类型有:string number boolean undefined null symbol null是对象吗?不是,虽然typeof出来是object,其实这是一个遗留下来的bug。js中判断为不同对象的标准是其二进制,而null的前三位二进制都表示为0,而js中前3位是0就判断为对象。而null实际是基础数据类型。 基本数据和复杂数据类型有什么区别?基本数据的复制,是直接开辟新的栈空间,在栈内保存新的值,所以修改复制的后的变量,原变量不会发生改变,虽然原变量不会发生改变,但是属于浅拷贝哦。而复杂数据类型的复制是复制栈地址指向堆值的指针,栈内存存的是地址,值在对内存。所以复制后的变量改变会影响原变量。如果想不改变原变量就需要使用深拷贝。在很多项目中,我们对store里面的数据进行操作,都会将对象的值通过如Object.assign的方式来复制一份来操作,这样的操作一般就是深拷贝
1、基本数据类型:string、null、boolean、undefined、number、symbol 2、null不是对象 3、基本数据类型存在栈中,复杂数据类型存在堆中。
1.基本数据类型:Symbol, String, Number , Undefined, Null, Boolean 2null为一个对象,可以用typeof null || Object.prototype.toString(null) 测试 3区别:在拷贝时,基本数据类型直接拷贝内容,复杂数据类型拷贝引用地址