美文网首页
web前端需要注意的知识点-笔记

web前端需要注意的知识点-笔记

作者: Aniugel | 来源:发表于2019-10-09 20:56 被阅读0次

1.取模运算的结果符号只与左边值的符号有关:

    var x = 7 % 3; // 结果为 1
    var y = 7 % (-3); // 结果为 1
    var z = (-7) % 3; // 结果为 -1

2. null、undefined、0、NaN、空字符串转换(Boolean()方法)为false(五类),其他转化为 true

    console.log('' == false)//true
    console.log(0 == false)//true
    console.log(NaN == false)//false
    console.log(undefined == false)//false
    console.log(null == false)//false
    console.log('-----------------------')
    console.log('' ? true : false)//false
    console.log(0 ? true : false)//false
    console.log(NaN ? true : false)//false
    console.log(undefined ? true : false)//false
    console.log(null ? true : false)//false
    console.log(![] == [])// true
    console.log([]==[])// false  分别占用了两个内存空间
    console.log([] ? true : false)//false Boolean()方法转换为true,一般判断为false
    console.log(Boolean(null) == 0)//true
    console.log(isNaN('123'))//false 隐式转换
    console.log(isNaN(123))//false
    console.log('undefined', isNaN(undefined))//true
    console.log('null', isNaN(null))//false  null-->0
    console.log(1 == !null)//true !null-->1

Number,Boolean,String,Undefined这几种基本类型混合比较时,会将其转换成数字再进行比较 基本类型与复合对象进行比较时,会先将复合对象转换成基本类型(依次调用valueOf与toString方法)再进行比较 undefined被当成基本类型,undefined转换成数字是NaN,因此undefined与除null之外的其它类型值进行比较时始终返回false(注意NaN==NaN返回false) null被当成复合对象,由于null没有valueOf与toString方法,因此和除了undefined之外的其它类型值进行比较时始终返回false
https://blog.csdn.net/magic_xiang/article/details/83686224

3.null是一个只有一个值的特殊类型。表示一个空对象引用(一个变量不再指向任何对象地址);可以主动释放一个变量引用的对象。null是对象所以可以来清空对象,任何变量都可以通过设置值为undefined 来清空,类型为 undefined.

    // 数组清空,直接给数组的length变为0
    let arr = ['apple', 'banana', 'orange']
    arr.length = 0
    console.log(arr)

4.for in 可以循环数组和对象,推荐对象的时候用for in,数组的时候用for of,for of不可以循环普通对象,自定义属性遍历不出来。for of不会跳过无定义的值,for in 会跳过无定义的值如下:

    // 不可以遍历普通对象
    var obj = { name: 'liu', age: 27 }
    for (let item of obj) {
        console.log(item)//Uncaught TypeError: arr is not iterable
    }
    // 自定义属性遍历不出来
    let arr = ['apple', 'banana', 'orange']
    arr.name = 'name';//自定义属性
    for (let keys of arr) {
        console.log(keys)//apple banana orange
    }
    arr.push('milk')//数组push方法还有用
    console.log(arr.length)//4 自定义属性不会改变数组长度

    console.log('-----------')

    // 自定义添加的属性数组 不具有数组相关的属性和方法
    let arr1 = []
    arr1.name = 'apple';
    arr1.banana = 'banana';
    console.log(arr1.length)//0
    for (let keys of arr1) {
        console.log(keys)//遍历不出来
    }
    arr1.push('milk')//数组push方法还有用
    console.log(arr1)//["milk", name: "apple", banana: "banana"]

   // for of不会跳过无定义的值,for in 会跳过无定义的值如下:
    var arr = [, 'apple', 'banana', 'orange']
    for (var key in arr) {
        console.log(arr[key])//apple banana orange
    }
    // console.log('--------')
    for (var item of arr) {
        console.log(item)//undefined apple banana orange
    }

5.forEach()方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)forEach()的返回值为undefined forEach()对于空数组是不会执行回调函数的没有办法中止或者跳出 forEach()循环,除了抛出一个异常

    [2, 3, 1, , , 7].forEach((val, index, arr) => {
        console.log(val)//2 3 1 7
    })

6.Map方法中加入Number参数可以将数组中的字符串数字转化成数字

    var arr = ['1', '4', '3']
    var newArr = arr.map((value, index, array) => {
        return value
    })
    var newArr1 = arr.map(str => parseInt(str));
    var newArr2 = arr.map(Number)
    console.log(newArr)// '1', '4', '3'
    console.log(newArr1)// 1 4 3
    console.log(newArr2)// 1 4 3

7.下面输出的值是多少?(考察this)

    var length = 10;
    function fn() {
        console.log(this.length);
    }
    var obj = {
        length: 5,
        method: function (fn) {
            fn();
            arguments[0]();
        }
    };
    obj.method(fn, 1);

输出:10 2 第一次输出10应该没有问题。我们知道取对象属于除了点操作符还可以用中括号,所以第二次执行时相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2。

8.以下输出结果是?(变量隐式声明)

    if ('a' in window) {
        var a = 10;
    }
    console.log(a);

function和var会提前声明,而其实{...}内的变量也会提前声明。于是代码还没执行前,a变量已经被声明,于是 'a' in window 返回true,a被赋值。

    var a = 10;
    a.pro = 10;
    console.log(a.pro + a);

    var s = 'hello';
    s.pro = 'world';
    console.log(s.pro + s);

9.Number 对象方法

toExponential(x)把对象的值转换为指数计数法
toFixed(x)把数字转换为字符串,结果的小数点后有指定位数的数字。 |
toPrecision(x)把数字格式化为指定的长度。
toString()把数字转换为字符串,使用指定的基数
valueOf()返回一个 Number 对象的基本数字值。

    let a = 3;
    console.log(a.toExponential())//3e+0
    console.log(typeof a.toExponential())//string
    console.log(a.toFixed(2))//3.00
    console.log(typeof a.toFixed(2))//string
    console.log(a.toPrecision(2))//3.00
    console.log(typeof a.toPrecision(2))//string

10.许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。由于后者不通过jQuery对象操作,所以相对开销较小,速度比较快

    var $text = $("#text");
    var $ts = $text.text();
    // 改良后↓
    var $text = $("#text");
    var $ts = $.text($text);
    // 这里是用了“$.text() ”的内置函数,其他类似的还有“$.data() ”等

11.字符串的拼接在开发中会经常遇到,用“+=”的方式来拼接字符串的效率非常的低,我们可以利用数组的“.join()”方法。

    console.time('测试时间')
    var arr = [];
    for (var i = 0; i < 100; i++) {
        arr[i] = `<li>${i}</li>`;
    }
    $('ul').html(arr.join(''));
    console.timeEnd('测试时间')
    // 以前我很喜欢用数组的原生的方法“.push() ”,
    // 其实直接用arr[i]或者arr[arr.length]的方式要快一点,但是差别不是很大。

12.不要让代码暴露在全局作用域下

image.png

13.background-position 和 background-size 属性, 之间需使用/分隔, 且position值在前, size值在后。如果同时使用 background-origin 和 background-clip 属性, origin属性值需在clip属性值之前, 如果origin与clip属性值相同, 则可只设置一个值。

background: url("image.png") 10px 20px/100px no-repeat content-box;

14.设置为null的变量或者对象会被内存收集器回收,null转为数字类型值为0,而undefined转为数字类型为 NaN(Not a Number)

    Number(null)//0
    0 == null//false
    null == false//false

15.javascript判断是否是数组方法总结

// 判断是不是数组
    // ① 方法简单有效,缺点是IE8及以下版本浏览器不兼容
    var arr = [3, 4, 5, 6]
    var isArr = Array.isArray(arr)
    console.log(isArr)

    // ②
    var arr = [3, 4, 5, 6]
    var isArr = arr instanceof Array
    console.log(isArr)

    // ③
    var arr = [3, 4, 5, 6]
    var isArr = arr.constructor === Array
    console.log(isArr)
    console.log(typeof arr)

    // 判断数组封装的方法
    function isArray(obj) {
        return typeof obj == 'object' && obj.constructor == Array
    }

    // ④第二第三种方法也有列外情况,比如在跨框架iframe的时候使用页面中的数组时会失败,
    // 因为在不同的框架iframe中,创建的数组是不会相互共享其prototype属性的;当第二第
    // 三种方法也不能用时,可以使用最通用的方法 Object.prototype.toString.call()
    function isArray(obj) {
        return Object.prototype.toString.call(obj) == '[object Array]';
    }//仅判断Array

    function isType(data, type) {
        return Object.prototype.toString.call(data) === "[object " + type + "]";
    } //通用判断方法

    // 方法中的call()可以换成apply(),不能直接用toString调用,
    // 因为从原型链的角度讲,所有对象的原型链最终都指向了 Object, 
    // 按照JS变量查找规则,其他对象应该也可以直接访问到 Object 的
    //  toString方法,但是大部分的对象都实现了自身的 toString 方
    //  法,这样就可能会导致 Object 的 toString 被终止查找,因此要用 
    //  call或apply 来强制调用Object 的 toString 方法


拓展:怎么判断一个变量是数组

1、Array.isArray判断,返回true,说明是数组
2、instanceof Array判断,返回true。说明是数组
3、使用Object.prototype.toString.call判断,如果值是[object Array],说明是数组
4、通过constructor来判断,如果是数组,那么arr.constructor === Array(不准确,因为我们可以指定obj.constructor = Array)

    function fn() {
        console.log(Array.isArray(arguments));   //false; 因为arguments是类数组,但不是数组
        console.log(Array.isArray([1, 2, 3, 4]));   //true
        console.log(arguments instanceof Array); //fasle
        console.log([1, 2, 3, 4] instanceof Array); //true
        console.log(Object.prototype.toString.call(arguments)); //[object Arguments]
        console.log(Object.prototype.toString.call([1, 2, 3, 4])); //[object Array]
        console.log(arguments.constructor === Array); //false
        arguments.constructor = Array;
        console.log(arguments.constructor === Array); //true
        console.log(Array.isArray(arguments));        //false
    }
    fn(1, 2, 3, 4);

16.innerText、innerHTML、outerHTML的区别

<body>
    <p><span><i>234567</i></span></p>
</body>
<script>
    let a = document.querySelector('p').outerHTML
    let b = document.querySelector('p').innerHTML
    let c = document.querySelector('p').innerText
    console.log(a);//<p><span><i>234567</i></span></p>
    console.log(b);//<span><i>234567</i></span>
    console.log(c);//234567
</script>

17.
18.
19.
20.
21.
22.
23.
24.
25.

相关文章

网友评论

      本文标题:web前端需要注意的知识点-笔记

      本文链接:https://www.haomeiwen.com/subject/efgwpctx.html