Step-By-Step
Step-By-Step copied to clipboard
JS中基本数据类型有哪几种?null 是对象吗?基本数据和复杂数据类型有什么区别?
1.基本数据类型:Symbol, String, Number , Undefined, Null, Boolean 2null为一个对象,可以用typeof null || Object.prototype.toString(null) 测试 3区别:在拷贝时,基本数据类型直接拷贝内容,复杂数据类型拷贝引用地址
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不是一个对象而是一个原始值。 基本数据类型的值存储在栈内存里,而复杂类型的的地址存储在栈内存,值存储在堆内存。
- String,Number,Boolean,Null,Undefined,Symbol;
- 不是
- 基本数据类型是存在栈内存中的,引用类型是存在堆内存中的; 引用类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用,所以JS中引用数据类型的操作都是操作对象的引用而不是实际的对象,从而延伸出了 “深拷贝和浅拷贝”的问题
1.基本数据类型:Number, String, Undefined,Null ,Boolean es6新增Symbol 2null 不是一个对象 虽然typeof 判断返回一个对象 区别:基本类型 在创建是 会在栈上画出一块内存 将数值直接存到栈上 引用类型 在创建是 首先会在栈上给他引用分配一块空间 尔对象的具体信息存在堆内存里 然后根据栈的上的指针指向堆中的对象地址 也就是查询
基本数据类型有: String, Number,Boolean, undefined, null 引用数据类型有: object,function null 是对象 理解基本数据类型,和引用数据类型为 基本数据类型值 存放于栈内存中 引用数据类型 内存存放于堆内存中 只是向栈中保留一个指针 根据指针去取。
JS的基本类型(primitive values)有
- Undefined
- Null
- Boolean
- String
- Symbol (ES2015新增)
- Number
- Object
除 Object 以外的所有类型都是不可变的(值本身无法被改变)。
鱼头注:在最新的ECMA proposal里有个处于Stage 3的基本数据类型 BigInt
,用于表示比253大的所有数字。
具体可参考:
https://tc39.github.io/proposal-bigint/#sec-bigint-objects
null是对象吗?
在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)。
JS基本类型与复杂类型的区别
基本类型存储的是值,复杂类型存储的是地址(指针)。
当你创建了一个复杂类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。
当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),当我们进行数据修改的时候,就会修改存放在地址(指针) 上的值。
基本类型有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 是对象吗?基本数据和复杂数据类型有什么区别?
JavaScript中类型有8种:
- 基本类型:Number、String、Boolean、undefined、null、Symbol(ES6)、BigInt(ES10)
- 引用类型
Sybmol表示独一无二的值
BigInt可以表示任意精度的整数,在数字末尾加上一个n表示BigInt类型
const b = 123456789n;
null
使用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对象中的一个元素(即局部变量);在向参数传递引用类型的值时,会把对应值的地址复制给一个局部变量,因此局部变量的变化会反映到函数的外部。
基本数据类型
- String
- Null
- Number
- Boolean
- Undefined
- Symbol(ES6新增)
- BigInt(ES10新增)
复杂数据类型
- Object
当我们用 typeof null时, 会输出object, 这是因为在JS 最初的版本中,
000
开头代表对象, 而null
表示为全0
, 所有将其错误的判断为object
, 即使后来内部的判断规则改变了, 这个bug 还是流传下来啦
- 基本数据类型存储的是值,而复杂数据类型存储的是地址(指针)
- 当我们拷贝一个值时, 基本数据类型拷贝的时独立的值, 而复杂数据类型存储的是地址(指针), 这就导致了我们复制的是原来变量的地址(指针), 当我们进行数据修改时, 所有拥有相同地址(指针)的变量的值都会发生改变
-
typeof
可以正确判断除了null
其他的所有基本类型, 而判断复杂数据类型,我们建议使用instanceof
目前,JS原始类型有六种,分别为:
- Bool
- String
- Number
- Undefined
- null
- Symbol(ES6新增)
ES10新增了一种基本数据类型:BigInt
复杂数据类型只有一种:
- Object
null 不是一个对象,尽管 typeof null
输出的是 object
,这是一个历史遗留问题,JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,null
表示为全零,所以将它错误的判断为 object
。
基本数据类型和复杂数据类型的区别为:
1.内存的分配不同
-
基本数据类型存储在栈中。
-
复杂数据类型存储在堆中,栈中存储的变量,是指向堆中的引用地址。
2.访问机制不同
- 基本数据类型是按值访问
- 复杂数据类型按引用访问,JS不允许直接访问保存在堆内存中的对象,在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。
3.复制变量时不同
- 基本数据类型:a=b;是将b中保存的原始值的副本赋值给新变量a,a和b完全独立,互不影响
- 复杂数据类型:a=b;将b保存的对象内存的引用地址赋值给了新变量a;a和b指向了同一个堆内存地址,其中一个值发生了改变,另一个也会改变。
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 }
A1
基本数据类型
- number
- string
- boolean
- undefined
- null
- symbol
引用数据类型
- function
- object
- array
A2
null不是一个对象,它只是用来保存对象,还没有真正的保存值,所以说它是一个空对象指针 即使
typeof null // object
可是它也
typeof [] // object呢
A3
基本数据类型: 存放在栈内存中,它们是按值存放的 引用数据类型: 存放在堆内存当中,它们是按引用地址存放的
这道题可以引出另外一个问题,浅拷贝和深拷贝
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
1. 基本数据类型
Number, String, Boolean, Null, Undefined, Symbol
2. null 不是真正意义上的对象或者对象的实例。它只是空指针,它不引用内存地址。
3. 基本数据类型存在栈内存中,传值的时候是拷贝赋值。复杂数据类型由基本数据类型按照一定结构组成,包含数组,对象,函数。他们存在堆内存中,并有一个唯一的16进制地址,他们传值其实是传地址。堆内存不会自动销毁,在被没有引用时,在浏览器空闲时会被浏览器回收。
JS中基本数据类型
-
原始数据类型 (不是对象且没有方法)
Boolean、Null、Undefined、Number、String、Symbol(ES6 新增)、BigInt(ES10)
- Boolean 类型 表示一个逻辑实体,有两个值:true 和 false。
- Null 类型 表示缺少的标识,指示变量未指向任何对象。
- Undefined 类型 一个没有被赋值的变量会有个默认值 undefined。
- Number 类型 根据 ECMAScript 标准,Number 基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(263 -1) 到 263 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
- String 类型 用于表示文本数据。它是一组16位的无符号整数值的“元素”。
- Symbol 类型 表示独一无二的值。
- BigInt 类型 BigInt 是 JavaScript 中的一个新的原始数值类型,它可以以任意精度表示整数。使用 BigInt 可以安全地存储和操作大型整数,甚至超过数字的安全整数限制。一个 BigInt 数据可以通过将 n 附加到 Integer 的末尾或通过调用构造函数创建。
-
复杂数据类型 Object (emm 这个内容太多了)
null 是对象吗?
不是。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
区别是:基本数据类型存在栈里面,复杂数据存在堆里面,需要访问堆里面的数据,是去栈里面获取地址,根据地址去堆里面查找