关于object:JavaScript的对象原型类和继承

前言HTML万物皆标签。 CSS万物皆盒。 JavaScript万物皆对象。 对象JavaScript对象的实质是数据和性能的汇合,语法上体现为键值对的汇合。 键对象的键能够了解为变量名。 值对象的值的类型能够是任意数据类型。 键值对键和值之间用:相连。 多组键值对之间用,宰割。 let profile = { name: '吴彦祖', age: 48, charmingThenMe: false, works: ['特警新人类', '新警察故事', '门徒', '除暴'], bio: function () { alert('你很能打吗?你会打有个屁用啊。') }, hi() { this.bio() alert('进去混要有权势,要有背景,你哪个道上的?') }}依照值是否为函数这一规范,进一步将键值对分为属性(property)和办法(method)。 对象为数据和性能的汇合,数据对应属性,性能对应办法。 以profile为例,前四个为属性,后俩为办法。hi() { ...}// 等价于hi: function() { ...}// 下面的写法是办法的短语法。拜访有两种形式拜访对象的键值对,别离为点式拜访和括号式拜访。 // 点式拜访profile.name // '吴彦祖'// 括号式拜访profile['age'] // 48当你发现在一些非凡场景下应用点式拜访无奈实现时,记得尝试括号式拜访。 这些非凡场景大多呈现于键产生于运行时。 比方:当你在遍历中须要从实参中获取键。或者你须要同时定义对象的键和值。 构造函数理论开发中,若依照下面的形式应用对象,意味着每须要一个profile都须要手动写出一个领有雷同键的对象,这会带来灾难性的结果: 巨量的反复代码一旦须要更新属性或办法,则必须遍历每一个对象咱们须要形象。 具体来说,咱们须要一个函数,能够主动创立具备雷同键的对象,而不是每次应用时,手动重写一遍键。 // 键只须要在定义createProfile()时写一次function createProfile(name, age, charmingThenMe, works, bio, hi) { let o = {} o.name = name o.age = age o.charmingThenMe = charmingThenMe o.works = works o.bio = function () { alert(bio) } o.hi = function () { o.bio() alert(hi) } return o}// 后续生成对象时,只须要写值,键会主动填充let edisonChen = createProfile( '陈冠希', 42, false, ['无间道', '头文字D', '神枪手'], '在吗拓海', '微信转账三百块')edisonChen.nameedisonChen.hi()形象实现。 ...

August 29, 2022 · 3 min · jiezi

关于object:obj格式-小结

obj文件罕用局部包含:顶点(v),法向量(vn),贴图坐标顶点(vt),个人(g),面(f) 前三个是间接列出来,供面来按index援用的。index都是从1开始,两头能够被打断,但计数不中断。 eg1 v 0 0 0v 1 0 0v 0 1 0v 1 1 0v 0 0 1v 1 0 1v 0 1 1v 1 1 1v 0.5 0.5 0.8v 0 0 1.2v 1 0 1.2v 0 1 1.2vn -0 -0 -1vn -0 -1 -0vn 0 -0 -1vn -1 -0 -0vn -0 -1 0vn 1 -0 -0vn -0 1 -0vn -1 0 -0vn -0 -0 1vn 1 -0 -0vn -0 1 -0vn -0 -0 1vn -0 -0.624695 -0.780869vn -0.624695 0 -0.780869vn -0 -0 1vn 0.707107 0.707107 -0g polygon1f 1//1 3//1 2//1f 2//2 5//2 1//2f 3//3 4//3 2//3f 1//4 5//4 3//4f 2//5 6//5 5//5f 4//6 6//6 2//6f 3//7 7//7 4//7f 5//8 7//8 3//8f 6//9 7//9 5//9f 4//10 8//10 6//10f 7//11 8//11 4//11f 6//12 8//12 7//12g polygon2f 9//13 11//13 10//13f 10//14 12//14 9//14f 11//15 12//15 10//15f 9//16 12//16 11//16 ...

March 22, 2021 · 1 min · jiezi

关于object:前端面试每日-31-第621天

明天的知识点 (2020.12.27) —— 第621天 (我也要出题)[html] 百度、淘宝、京东挪动端首页秒开是如何做到的?[css] 在Sass中Mixin有什么利用场景?[js] js可能保障object属性的输入程序吗?如果能够怎么做?[软技能] 说说你了解的HTTP response 报文构造是怎么的?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 27, 2020 · 1 min · jiezi

ES5-的构造函数原型链继承

构造函数构造函数,就是专门用来生成实例对象的函数。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。 function Person(name){ this.name = name;}为了与普通函数区别,构造函数名字的第一个字母通常大写。 构造函数的特点有两个: 函数体内部使用了 this 关键字,代表了所要生成的对象实例。生成对象的时候,必须使用 new 命令。new 命令基本用法new 命令的作用,就是执行构造函数,返回一个实例对象。 let a = new Person('dora');a.name // doranew 命令本身就可以执行构造函数,所以后面的构造函数可以带括号,也可以不带括号,但为了表明是函数调用,推荐使用括号表示更明确的语义。 new 命令的原理使用 new 命令时,它后面的函数依次执行下面的步骤: 创建一个空对象,作为将要返回的对象实例。let o = new Object();将这个空对象的原型,指向构造函数的prototype属性。 Object.setPrototypeOf(o,Foo.prototype);将构造函数的 this 绑定到新创建的空对象上。Foo.call(o);始执行构造函数内部的代码。如果构造函数内部有 return 语句,而且后面跟着一个对象,则 new 命令会返回 return 语句指定的对象;否则,就会不管 return 语句,返回 this 对象,且不会执行 return 后面的语句。 function Person(name) { this.name = name; if (name == undefined) { return {}; }else if(typeof name != 'string'){ return '姓名有误'; } console.log(111);}new Person(); // {}new Person(123); // {name: 123}new Person('dora'); // {name:'dora'}// 111new.target如果当前函数是 new 命令调用的,在函数内部的 new.target 属性指向当前函数,否则为 undefined。 ...

October 9, 2019 · 2 min · jiezi

Objective-C中的associated object释放时机问题

如果对象A持有对象B,B作为A的associated object,并且表面上B没有其他被强引用的地方,那么对象A被释放时,对象B一定会同时释放吗?大部分情况下是,但真有不是的时候。最近实现代码的时候不小心就碰到了这样的特殊情况。需求需要监听对象A释放(dealloc)并执行对象A的a方法。此时引入对象B,并作为对象A的associated object。A释放时触发B释放,在B的dealloc方法中执行A的a方法。对象B需要一个指向对象A的属性,并声明为unsafe_unretained(或assign),因为weak指针此时已经失效了。示例代码@interface MyObject1 : NSObject@end@implementation MyObject1- (void)foo { NSLog(@“success”);}@end@interface MyObject2 : NSObject@property (nonatomic, unsafe_unretained) MyObject1 *obj1;@end@implementation MyObject2- (void)dealloc { [self.obj1 foo];}+ (instancetype)create { return [[self class] new];}@end@implementation ViewController+ (void)load { [self fun1];}+ (void)fun1 { MyObject1 *mo1 = [MyObject1 new]; @synchronized (self) { MyObject2 *mo2 = [MyObject2 create]; mo2.obj1 = mo1; objc_setAssociatedObject(mo1, @selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }}@end问题运行时出现崩溃,unsafe_unretained指针已经野了,和预期的不一样。堆栈是这样的:观察崩溃的堆栈,发现mo2对象是被自动释放池释放了。因为mo1对象是在函数退出时就立即释放,这样导致mo1比mo2先被销毁,mo2访问了无效指针导致了崩溃。这个问题和@synchronized有关系,但目前我还不知道它和arc之间有什么联系。下面给出另一个case,修改一行代码就不会崩溃了:+ (void)fun2 { MyObject1 *mo1 = [MyObject1 new]; MyObject2 *mo2 = [MyObject2 create]; @synchronized (self) { mo2.obj1 = mo1; objc_setAssociatedObject(mo1, @selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }}实际上只是把mo2的声明移动到了@synchronized外面,堆栈变成了这样:这时,mo2的释放发生在调用方法的结束时。分析使用Hooper查看汇编代码,观察fun1和fun2的不同。节选出关键部分:fun1:fun2:核心在于:fun1中,创建mo2后调用了retain,fun2中,调用的则是objc_retainAutoreleasedReturnValue。我们再来看看create方法:关键的一行在最后,调用了objc_autoreleaseReturnValue。关于objc_retainAutoreleasedReturnValue和objc_autoreleaseReturnValue,请移步 https://www.jianshu.com/p/2f05060fa377 。大意是,这两个方法成对出现时,可以优化掉[[obj autorelease] retain]这种骚操作。结论在fun1中,由于没有objc_retainAutoreleasedReturnValue,取而代之的是retain,导致对象被放入自动释放池。对于@synchronized为什么会造成不同,我还没有那么深入。因为全局自动释放池会延迟对象的释放,如果代码非常依赖对象的释放时机则会比较危险。我认为这样做是最保险的,创建一个局部自动释放池,保证局部变量在函数结束时立即释放:+ (void)fun3 { MyObject1 *mo1 = [MyObject1 new]; @autoreleasepool { @synchronized (self) { MyObject2 *mo2 = [MyObject2 create]; mo2.obj1 = mo1; objc_setAssociatedObject(mo1, @selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } }}参考资料objc_autoreleaseReturnValue和objc_retainAutoreleasedReturnValue函数对ARC的优化 https://www.jianshu.com/p/2f05060fa377本文作者:三豊阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

February 19, 2019 · 1 min · jiezi

对象的合并及拷贝

对象的合并及拷贝Object.assign()Object.assign() 方法用于对象的合并,将所有自身的(非继承的)可枚举属性的值从一个或多个源对象拷贝到目标对象。返回目标对象。目标对象自身也会改变。Object.assign(target, …sources)target: 目标对象。sources: 源对象。Object.assign() 合并拷贝属性的限制只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。Object.assign({b: ‘c’}, Object.defineProperty({}, ‘invisible’, { enumerable: false, value: ‘hello’ }))// { b: ‘c’ }参数类型1. 只有一个参数如果只有一个参数,Object.assign() 会直接返回该参数。let obj = {a: 1};Object.assign(obj) === obj // true如果该参数不是对象,则会先转成对象,然后返回。typeof Object.assign(2) // “object"由于 undefined 和 null 无法转成对象,所以如果它们作为参数,就会报错。Object.assign(undefined) // 报错Object.assign(null) // 报错2. 对象 + 非对象非对象参数都会转成对象,如果无法转成对象,就会跳过,不会报错。如果非对象参数为 undefined 和 null ,就会跳过,不会报错,返回的依旧是目标对象参数。let obj = {a: 1};Object.assign(obj, undefined) === obj // trueObject.assign(obj, null) === obj // true如果非对象参数为其他类型的值(即数值、字符串和布尔值),也不会报错。但是,除了字符串会以数组形式拷贝入目标对象,其他值都不会产生效果。这是因为只有字符串的包装对象,会产生可枚举属性。let v1 = ‘abc’;let v2 = true;let v3 = 10;let obj = Object.assign({}, v1, v2, v3);console.log(obj) // { “0”: “a”, “1”: “b”, “2”: “c” }3. 目标对象 + 源对象…(1) 属性值为 null 或 undefined 的属性会正常合并Object.assign() 不会跳过那些属性值为 null 或 undefined 的源对象。var o1 = { a: null, b: 1};var o2 = { c: undefined }; var obj = Object.assign({}, o1, o2);obj // {a: null, b: 1, c: undefined}(2) 同名属性的替换如果目标对象与源对象中的属性具有相同的键,则目标对象属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。var o1 = { a: 1, b: 1, c: 1 };var o2 = { b: 2, c: 2 };var o3 = { c: 3 };var obj = Object.assign({}, o1, o2, o3);obj // { a: 1, b: 2, c: 3 }(3) 浅拷贝Object.assign() 方法实行的是浅拷贝,而不是深拷贝。拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。var obj1 = { a: 0 , b: { c: 0 } };var obj2 = Object.assign({}, obj1);obj2 // { a: 0, b: { c: 0 } };obj2.b.c = 3;obj1 // { a: 0, b: { c: 3 } };obj2 // { a: 0, b: { c: 3 } };(4) 数组的处理Object.assign() 可以用来处理数组,但是会把数组视为键值为数组下标的对象来合并,然而最终的返回形式也是数组。Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3]Object.assign({0:1,1:2,2:3},{0:4,1:5}) // {0: 4, 1: 5, 2: 3}(5) 存取器属性的处理Object.assign() 如果遇到存取器定义的属性,会只拷贝值。var obj = { foo: 1, get bar() { return 2; }};var copy = Object.assign({}, obj); copy // { foo: 1, bar: 2 }因此必须使用 Object.getOwnPropertyDescriptors() 方法配合 Object.defineProperties() 方法,就可以实现正确拷贝。但仅限于可拷贝 getter 和 setter ,对于属性的引用类型还是属于浅拷贝。var obj = { foo: { a : 0 }, get bar() { return 2; }};var target = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));Object.getOwnPropertyDescriptor(target, ‘bar’)// { get : ƒ bar(), set : undefined, enumerable : true, configurable : true } obj.foo.a = 6target.foo.a // 6常见用途1. 为对象添加属性class Point { constructor(x, y) { Object.assign(this, {x, y}); }}上面方法通过 Object.assign() 方法,将 x 属性和 y 属性添加到 Point 类的对象实例。2. 为对象添加方法Object.assign(SomeClass.prototype, { someMethod(arg1, arg2) { ··· }, anotherMethod() { ··· }});// 等同于下面的写法SomeClass.prototype.someMethod = function (arg1, arg2) { ··· };SomeClass.prototype.anotherMethod = function () { ··· };3. 浅克隆对象let obj = {a:5};function clone(origin) { return Object.assign({}, origin);}let aaa = clone(obj); // {a:5}不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。function clone(origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin);}4. 合并多个对象let merge = (target, …sources) => Object.assign(target, …sources);如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。let merge = (…sources) => Object.assign({}, …sources);5. 为属性指定默认值const DEFAULTS = { a: 0, b: ‘ccc’};function copy(options) { options = Object.assign({}, DEFAULTS, options); // …}注意,由于存在浅拷贝的问题,DEFAULTS对象和options对象的所有属性的值,最好都是简单类型,不要指向另一个对象。否则,DEFAULTS对象的该属性很可能不起作用。参考链接:Object.assign()深拷贝1. JSON.parse(JSON.stringify(obj))var obj1 = { a: 0 , b: { c: 0}};var obj2 = JSON.parse(JSON.stringify(obj1));obj1.b.c = 4;obj2 // { a: 0, b: { c: 0}}但由于 JSON 的局限性,该方法也不是万能的。比如,如果对象的属性是 undefined、函数、symbol 或 XML 对象,该属性会被 JSON.stringify() 过滤掉,导致拷贝时会缺少属性。let obj = { name:‘dora’, sayHello:function(){ console.log(‘Hello World’); }}let cloneObj = JSON.parse(JSON.stringify(obj));console.log(cloneObj); // {name: “dora”}2. 利用递归对每一层都重新创建对象并赋值从而实现深拷贝function deepClone(source){ let targetObj = source.constructor === Array ? [] : {}; for(let keys in source){ if(source.hasOwnProperty(keys)){ if(source[keys] && typeof source[keys] === ‘object’){ targetObj[keys] = source[keys].constructor === Array ? [] : {}; targetObj[keys] = deepClone(source[keys]); }else{ targetObj[keys] = source[keys]; } } } return targetObj;}let obj = { a: { b: 1, c: 2 }, sayHello: function(){ console.log(‘Hello World’); } }let cloneObj = deepClone(obj);obj.a.b = 4obj // {a:{b: 4, c: 2},sayHello:ƒ ()}cloneObj // {a:{b: 1, c: 2},sayHello:ƒ ()} ...

January 17, 2019 · 3 min · jiezi

document与Object的关系

window与Objet1、 window.proto === Window.prototype2、 window.proto.proto === 窗口属性(WindowProperties)3、 window.proto.proto.proto === EventTarget.prototype4、 EventTarget.prototype.proto === Object.prototype5、 Event.prototype.proto === Object.prototypedocument与Objet1、 document.proto === HTMLDocument.prototype2、 HTMLDocument.prototype.proto === Document.prototype3、 Document.prototype.proto === Node.prototype4、 Node.prototype.proto === EventTarget.prototype5、 EventTarget.prototype.proto === Object.prototype元素节点与Objetvar h = getElementById(‘id’);1、 h.proto === HTMLDivElement.prototype2、 HTMLDivElement.prototype.proto === HTMLElement.prototype3、 HTMLElement.prototype.proto === Element.prototype4、 Element.prototype.proto === Node.prototype5、 Node.prototype.proto === EventTarget.prototype6、 EventTarget.prototype.proto === Object.prototype属性节点与Objetvar attr = h. attributes[0];1、 h.attributes.proto === NamedNodeMap.prototype2、 NamedNodeMap.prototype.proto=== Object.prototype1、 h.attributes[0].proto === Attr.prototype2、 Attr.prototype.proto === Node.prototype3、 Node.prototype.proto === EventTarget.prototype 4、 EventTarget.prototype.proto === Object.prototype属性获取与赋值1、 h.id === h.attributes.id.value === h.attributes[n].value2、 h.className === h.attributes.class.value === h.attributes[n].valuedom对象api扩展1、DocumentDocument.prototype.aa = function(){console.log(1)}document.aa(); //1document.getElementById(‘id’).aa(); // Uncaught TypeError: h.aa is not a function2、ElementElement.prototype.bb = function(){console.log(1)}document.bb(); // Uncaught TypeError: document.bb is not a functiondocument.getElementById(‘id’).bb(); // 13、ObjectObject.prototype.cc = function(){console.log(1)}document.cc(); //1document.getElementById(‘id’).cc(); // 1 ...

December 28, 2018 · 1 min · jiezi

JavaScript:对Object对象的一些常用操作总结

JavaScript对Object对象的一些常用操作总结。一、Object.assign()1.可以用作对象的复制var obj = { a: 1 };var copy = Object.assign({}, obj);console.log(copy); // { a: 1 }2.可以用作对象的合并var o1 = { a: 1 };var o2 = { b: 2 };var o3 = { c: 3 };var obj = Object.assign(o1, o2, o3);console.log(obj); // { a: 1, b: 2, c: 3 }console.log(o1); // { a: 1, b: 2, c: 3 } 注意目标对象自身也会改变。3.目标对象o1自身也发生了改变,假如不想让o1改变,可以把三个对象合并到一个空的对象中,操作如下: var obj = Object.assign({},o1, o2, o3);console.log(obj); // { a: 1, b: 2, c: 3 }console.log(o1); // { a: 1 }注意:以下几个地方1.继承属性和不可枚举属性是不能拷贝的var obj = Object.create({foo: 1}, { // foo 是个继承属性 bar: { value: 2 // bar 是个不可枚举属性。 }, baz: { value: 3, enumerable: true // baz 是个自身可枚举属性 }});var copy = Object.assign({}, obj);console.log(copy); // { baz: 3 }2.原始类型会被包装为 objectvar v1 = “abc”;var v2 = true;var v3 = 10;var v4 = Symbol(“foo”)var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); // 原始类型会被包装,null 和 undefined 会被忽略// 注意,只有字符串的包装对象才可能有自身可枚举属性console.log(obj); // { “0”: “a”, “1”: “b”, “2”: “c” }二、Object.create()Object.create()的不止是有一个参数,其实还有第二个参数!Object.create(proto, [ propertiesObject ])第二个参数是可选的,主要用于指定我们创建的对象的一些属性,(例如:是否可读、是否可写,是否可以枚举等等)可以通过下面案例来了解第二个参数!var o;o = Object.create(Object.prototype, { // foo会成为所创建对象的数据属性 foo: { writable:true, configurable:true, value: “hello” }, // bar会成为所创建对象的访问器属性 bar: { configurable: false, get: function() { return 10 }, set: function(value) { console.log(“Setting o.bar to”, value) }}})// 创建一个以另一个空对象为原型,且拥有一个属性p的对象o = Object.create({}, { p: { value: 42 } })// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的o.p = 24o.p//42o.q = 12for (var prop in o) { console.log(prop)}//“q"delete o.p//false//创建一个可写的,可枚举的,可配置的属性po2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });三、Object.is()用来判断两个值是否是同一个值。下面是一些例子,面试中可能会提及Object.is(‘haorooms’, ‘haorooms’); // trueObject.is(window, window); // trueObject.is(‘foo’, ‘bar’); // falseObject.is([], []); // falsevar test = { a: 1 };Object.is(test, test); // trueObject.is(null, null); // true// 特例Object.is(0, -0); // falseObject.is(-0, -0); // trueObject.is(NaN, 0/0); // trueObject.keys(obj)返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。let arr = [“a”, “b”, “c”];console.log(Object.keys(arr));// [‘0’, ‘1’, ‘2’] /* Object 对象 */let obj = { foo: “bar”, baz: 42 },keys = Object.keys(obj);console.log(keys);// [“foo”,“baz”] 四、Object.keys()Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。// simple arrayvar arr = [‘a’, ‘b’, ‘c’];console.log(Object.keys(arr)); // console: [‘0’, ‘1’, ‘2’]// array like objectvar obj = { 0: ‘a’, 1: ‘b’, 2: ‘c’ };console.log(Object.keys(obj)); // console: [‘0’, ‘1’, ‘2’]// array like object with random key orderingvar anObj = { 100: ‘a’, 2: ‘b’, 7: ‘c’ };console.log(Object.keys(anObj)); // console: [‘2’, ‘7’, ‘100’]// getFoo is a property which isn’t enumerablevar myObj = Object.create({}, { getFoo: { value: function () { return this.foo; } } });myObj.foo = 1;console.log(Object.keys(myObj)); // console: [‘foo’]方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。 Object.values会过滤属性名为 Symbol 值的属性。var an_obj = { 100: ‘a’, 2: ‘b’, 7: ‘c’ };console.log(Object.values(an_obj)); // [‘b’, ‘c’, ‘a’] var obj = { 0: ‘a’, 1: ‘b’, 2: ‘c’ };console.log(Object.values(obj)); // [‘a’, ‘b’, ‘c’]五、Object.entries()返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。const obj = { foo: ‘bar’, baz: 42 };console.log(Object.entries(obj)); // [ [‘foo’, ‘bar’], [‘baz’, 42] ] const simuArray = { 0: ‘a’, 1: ‘b’, 2: ‘c’ };console.log(Object.entries(simuArray)); // [ [‘0’, ‘a’], [‘1’, ‘b’], [‘2’, ‘c’] ]六、常用其他操作1.删除对象中的某个值,前面案例中也谢了可以直接用deletevar obj = {b:123};delete o.p // 或delete obj[b];2.遍历对象2.1for-in遍历var obj = {a: ‘ss’, b: ‘bb’, c: ‘cc’};for (var i in obj){ console.log(i+’:’+obj[i]);}2.2forEach遍历,先通过Object.keys()返回一个数组Object.keys(obj).forEach((value, index)=>{ console.log(value, index,obj[value]);});//等同于Object.keys(obj).forEach(function (value, index,c) { console.log(value, index,obj[value]);});2.3jQuery的$.each()方法:它接受两个参数,分别指代属性名和属性值$.each(obj,function(key,value){ console.log(key+”: “+value)其它一些不常用的对象操作属性:1.Object.freeze() 方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。2.Object.isFrozen() 方法判断一个对象是否被冻结(frozen)。3.Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。4.Object.isSealed() 方法判断一个对象是否是密封的(sealed)。5.Object.seal() 方法可以让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。6.Object.getOwnPropertyNames(obj)返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。7.Object.getOwnPropertySymbols(obj)返回一个数组,包含对象自身的所有 Symbol 属性的键名。8.Reflect.ownKeys(obj)返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。9.hasOwnProperty()判断对象自身属性中是否具有指定的属性。JavaScript字符串操作方法大全,包含ES6方法JavaScript常用数组操作方法,包含ES6方法 ...

November 4, 2018 · 3 min · jiezi