zoukankan      html  css  js  c++  java
  • 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__一级一级向上查找属性或方法

    prototype是构造函数中的一个指针,指向构造函数的原型对象

    例子1:实例用__proto__来访问它的原型,构造函数用prototype来访问原型对象

        <script>
            function Fun(name) {
                this.name = name
            }
            var a = new Fun('a');
            var b = new Fun('b');
            console.log(a.__proto__.constructor);
            console.log(b);
            console.log(Fun.prototype == a.__proto__); //true
            console.log(Fun.prototype == b.__proto__); //true
        </script>
    

    例子2:常用方法,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>
    
  • 相关阅读:
    CSS3阴影 box-shadow的使用和技巧总结[转]
    $.getJSON(url,function success(){})回调函数不起作用
    实现最小宽度的几种方法及CSS Expression[转]
    关于sql 中 group by 和 having
    hackerrank DFS Edges
    hackerrank [Week of Code 33] Bonnie and Clyde
    AtCoder Regular Contest 076
    大模数乘法模板
    AtCoder Grand Contest 016
    CodeChef June Challenge 2017
  • 原文地址:https://www.cnblogs.com/Zxq-zn/p/12071662.html
Copyright © 2011-2022 走看看