对象类型ECMAScript中的对象是数据和函数的集合。创建一个对象consto=newObject();consto=新对象;//有效,但不建议省略括号consto={};实例属性和方法:构造函数:构造函数。hasOwnProperty(propertyName):检查propertyName(传入的属性)是否存在于当前对象实例中(不存在于实例原型中)。isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。propertyIsEnumerable(propertyName):使用for-in语句检查propertyName(传入的属性)是否可枚举。toLocaleString():返回与执行环境的语言环境对应的对象的字符串表示形式。toString():返回对象的字符串表示形式。valueOf():返回对象的字符串、数字或布尔表示形式。通常与toString()返回值相同。consto=newObject();console.log(o.toLocaleString());//"[object对象]"console.log(o.toString());//"[objectObject]"console.log(o.valueOf());//"{}"符号类型代表一个唯一的值。是一种基本数据类型。从Symbol()返回的每个符号值都是唯一的。符号值可以用作对象属性的标识符;这是此数据类型的唯一目的。它不支持语法:newSymbol()。从ECMAScript6开始,不再支持围绕原始数据类型创建显式包装对象。但是,由于遗留原因,仍然可以创建现有的原始包装对象,例如newBoolean、newString和newNumber。CreateSymbol([description])描述:可选字符串。符号的描述,可用于调试(控制台显示、转换为字符串等)但不能访问符号本身。如果Symbol的参数是一个对象,会调用该对象的toString方法将其转换为字符串,然后生成一个Symbol值。varsym1=Symbol();varsym2=Symbol('foo');varsym3=Symbol('foo');typeofsym1//"symbol"sym1//Symbol()sym2//Symbol('foo')sym3//Symbol('foo')sym1.toString()//"Symbol()"sym2.toString()//"Symbol(foo)"sym3.toString()//"Symbol(foo)"sym2===sym3//假varsym=newSymbol();//TypeError//创建一个Symbol包装器对象varsym=Symbol("foo");typeofsym;//“符号”varsymObj=Object(sym);typeofsymObj;//"object"//操作`yoursymbolis${sym}`//TypeError:can'tconvertsymboltostringBoolean(sym)//trueNumber(sym)//TypeErrorSymbol.for([description])Symbol.for()和Symbol()都会生成一个新的Symbol。它们的区别在于前者会在全局环境中注册进行搜索,而后者则不会。Symbol.for()不会每次调用都返回一个新的Symbol类型的值,而是会先检查给定的key是否已经存在,如果不存在则创建一个新的值。Symbol.for("bar")===Symbol.for("bar");//trueSymbol.for()===Symbol.for();//trueSymbol("bar")===Symbol("bar");//falseSymbol.prototype.description获取Symbol的描述。ES2019提供的实例属性。constsym=Symbol('foo');sym.description//"foo"Symbol.keyFor()返回Symbol类型值的注册键。符号.keyFor();//TypeErrorconstsym1=Symbol('a');Symbol.keyFor(sym1);//undefinedconstsym2=Symbol.for("b");Symbol.keyFor(sym2);//"b"Object.getOwnPropertySymbols()获取指定对象的所有Symbol属性名。因为使用Symbol作为属性名,这个属性不会出现在for...in,for...of循环中,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify().constobj={};leta=Symbol('a');letb=Symbol('b');obj[a]='Hello';obj[b]='World';for(letiinobj){console.log(i);//无输出}Object.getOwnPropertyNames(obj);//[]Object.getOwnPropertySymbols(obj);//[Symbol(a),Symbol(b)]Reflect.ownKeys()返回所有类型的键,包括常规键和符号键。constobj={[Symbol('a')]:1,名字:'阿信',年龄:3};Reflect.ownKeys(obj);//["name","age",Symbol(a)]built-inTheSymbolvalueof...参考《JavaScript高级程序设计》(第三版)ECMAScript6入门-阮一峰
