js问题记录(一) -- 关于for in, sort(), 及prototype

1、关于for in

for in : 遍历对象中的可枚举的属性

例子1:for in 遍历对象的键为String类型,所以调用时用Object[key]形式,而不用Object.key形式

    <script>
        var obj = {
            name: "zxq",
            age: 22,
            sex: "男"
        }
        for (var key in obj) {
            console.log(key + ", " + obj[key]); //正确
            console.log(key + ", " + obj.key); //错误,找名为key的属性,undefined
            console.log(typeof(key)); //string
        }
    </script>

例子2:for in 只能遍历属性为可枚举的属性,对于数组或字符串中不可枚举的属性或方法而言

    <script>
        var obj = {
            name: "zxq",
            age: 22,
            sex: "男"
        }
        obj.say = function() {
            console.log('this is say');
        }
        console.log(Object.getOwnPropertyDescriptor(obj, 'say')); //可枚举{writable: true, enumerable: true, configurable: true, value: ƒ}
        Object.defineProperty(obj, 'final', {
            value: 'flase',
            enumerable: false
        }); //设置不可枚举的属性
        for (var key in obj) {
            console.log(key + ", " + obj[key]);
        }
        console.log(obj);
    </script>

例子2截图:

2、关于sort()

数组的排序方法,默认排序的顺序是根据字符串UniCode码,参数为可选的比较函数

例子1:没有参数时

    <script>
        var arr = [1, 2, 3, 12];
        arr.sort();
        console.log(arr); //[1, 12, 2, 3]
        arr = [1, 2, 4, [2, 1],
            [2, 2],
            [3, 1, 2]
        ];
        arr.sort();//会将值转为字符串,根据unicode编码排序
        console.log(arr);
    </script>

例子1截图:

例子2:有参数时,根据比较函数的返回值来排序,具体排序算法?(先相邻比较,在二分比较)[待学习确定]

    <script>
        var arr = [1, 2, 12, 5, 4];
        arr.sort(function(a, b) {
            console.log('a: ' + a + ' , ' + 'b: ' + b);
            console.log('a-b = ' + (a - b));
            return a - b;
        });
        console.log(arr);
        arr = [1, 2, [3, 4],
            [3, 2],
            [4, 5, 6], 4
        ];
        arr.sort(function(a, b) {
            console.log('a: ' + a + ' , ' + 'b: ' + b);
            console.log('a-b = ' + (a - b)); //存在NaN,console.log(Boolean(NaN));//false
            return a - b;
        })
        console.log(arr);
    </script>

例子2截图:

3、prototype和_proto_

实例对象的_proto_指向它的原型,原型链概念为按照_proto_一级一级向上查找属性或方法,_proto_不可直接调用

prototype是函数中的一个指针,指向实例的原型

例子1:常用方法,hasOwnProperty:判断对象本身的名称和属性 isPrototypeOf: object1.isPrototypeOf(object2),判断object1是否在object2的原型链上

    <script>
        class Fun {
            constructor(name) {
                this.name = name;
            }
            print() {
                console.log('this name is ' + this.name);
            }
        }
        class Son extends Fun {
            constructor(name, age) {
                super(name);
                this.age = age;
            }
        }
        var a = new Fun('zxq');
        var b = new Son('zzz', 22);
        console.log(a);
        console.log(b);
        console.log(a.hasOwnProperty('name')); //true
        console.log(Fun.isPrototypeOf(Son)); //true
    </script>

猜你喜欢

转载自www.cnblogs.com/Zxq-zn/p/12071662.html