You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
let mySymbol = new Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'hello';
// 第二种写法
let a = {
[mySymbol]: 'hello';
}
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, {value: 'hello'});
var str = 'hello';
console.log(Object.prototype.toString.call(str));//[object String]
var bool = true;
console.log(Object.prototype.toString.call(bool))//[object Boolean]
var num = 123;
console.log(Object.prototype.toString.call(num));//[object Number]
var nul = null;
console.log(Object.prototype.toString.call(nul));//[object Null]
var und = undefined;
console.log(Object.prototype.toString.call(und));//[object Undefined]
var oDate = new Date();
console.log(Object.prototype.toString.call(oDate));//[object Date]
var json = {};
console.log(Object.prototype.toString.call(json));//[object Object]
var arr = [];
console.log(Object.prototype.toString.call(arr));//[object Array]
var reg = /a/;
console.log(Object.prototype.toString.call(reg));//[object RegExp]
var fun = function () { };
console.log(Object.prototype.toString.call(fun));//[object Function]
var error = new Error();
console.log(Object.prototype.toString.call(error));//[object Error]
JavaScript规定了几种语言类型
String、Number、Boolean、Null、Undefined、Object、Symbol(ES6)
JavaScript对象的底层数据结构是什么
每个JS对象都有一个隐藏类与之关联,在
V8
中,位于堆内存并由GC
管理的所有JS对象的第一个字段都指向隐藏类。隐藏类存储中包含属性的数量,和一个指向描述符数组的指针。在这个描述符数组中包含有命名属性的信息,例如命名属性的名称和存储属性值的位置。隐藏类是动态创建的,并随着对象的变化而动态更新。具有相同结构的JS对象(相同顺序和相同命名的属性),他们的隐藏类会指向同一个,以此达到复用的目的。对于不同结构的JS对象将使用不同的HiddenClass
。有一个块是
properties
,用来存储命名属性有一个块是
elements
,用来存储数组索引属性Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol
JSON.stringify()
排除在输出内容之外,也不能通过Object.keys()
和for...in
来枚举,Object.getOwnPropertyNames(obj)
也获取不到,只有Object.getOwnPropertySymbols()
可以获取,因此我们可以模拟私有方法,为对象定义一些非私有的、但又希望只用于内部的方法。Symbol
值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性iframe
)但需要共享Symbol,那么需要Symbol.for()
来注册或获取一个window间全局的Symbol
实例JavaScript中的变量在内存中的具体存储形式
JavaScript
中的变量分为__基本类型__和__引用类型__。JavaScript
不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用。基本类型对应的内置对象,以及他们之间的装箱拆箱操作
number
->Number
boolean
->Boolean
string
->String
valueOf()
或者toString()
方法来实现的。理解值类型和引用类型
typeof
检测数据类型。instanceof
检测数据类型new
方法构造出的对象是引用型null和undefined的区别
null
表示的是空值即该处不应该有值,undefined
表示的是未赋值即此处应该有值但还没有定义null
转换为数值时为0,undefiend
转换为数值时为NaN至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型
typeof
,可以用来判断基本数据类型(除了null
),但是对于判断引用类型就有点不适用,因为它基本都只会返回'object'
,无法判断具体的类型。有些例外,例如typeof null === 'object'
、typeof function a(){} === 'function'
,typeof NaN === 'number'
,未声明的变量,typeof
照样返回'undefined'
instanceof
,判断对象和构造函数在原型链上是否有关系。无法检测基本数据类型。constructor
,查看对象对应的构造函数。constructor
在其对应对象的原型下面,是自动生成的。当我们写一个构造函数的时候,程序会自动添加:构造函数名.prototype.constructor = 构造函数名
。但是null
和undefined
无法判断,因为是无效的对象。使用constructor是不保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确。Object.prototype.toString
,返回toString
运行时this
指向的对象类型,返回的类型格式为[object xxx]
,xxx
是具体的数据类型。基本上所有对象的类型都可以通过这个方法得到。Object.prototype.toString.call(arr)
可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用
+
的运算,如果某一个或者某两个操作数是字符串,或者可以通过步骤得到字符串,则会进行字符串拼接,否则进行数字加法。应用:利用加空字符串来将数字转为字符串-
的运算,是数字运算,所以会转换成数字进行运算。对象会先转换成字符串,再转换成数字。应用:利用减去0来将字符串转为数字if(...)
语句中中的条件判断for(...;...;...)
语句中的条件判断表达式(第二个)while(...)
和do...while(...)
循环中的条件判断表达式? :
中的判断表达式||
和&&
左边的操作数(作为条件判断表达式)出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法
m*2^e
表示的数值而已Number.MAX_VALUE
,接近于1.79E+308
Number.MAX_SAFE_INTEGER
:2^53 - 1BigInt
类型,使用时在数字后面增加一个n
toFixed()
方法:四舍五入为指定位数的小数,结果不可靠Number.EPSILON
,如果误差能够小于Number.EPSILON
,我们就可以认为结果是可靠的The text was updated successfully, but these errors were encountered: