工作中积累的问题、知识点总结100题(21-40)

21.非匿名自执行函数

  1.函数名只读

// b 打印的值是什么
var b = 10;
(function b(){
    b = 20;
    console.log(b)
})()

解析:

- 如标题一样,非匿名自执行函数,函数名不可以修改,严格模式下会TypeError,
- 非严格模式下,不报错,修改也没有用。
- 查找变量b时,立即执行函数会有内部作用域,会先去查找是否有b变量的声明,有的话,直接复制
- 确实发现具名函数Function b(){} 所以就拿来做b的值
- IIFE的函数内部无法进行复制(类似于const)
打印结果为:Function b

  2.

//  打印的值
var b = 10;
(function b(){
    var b = 20;
    console.log(window.b)
    console.log(b)
})()
输出:
10
20

  3.

  var b = 10;
  (function b(){
      console.log(b)
      b = 5
      console.log(window.b)
      var b = 20
      console.log(b)
  })()

22.变量提升(21.10.22 更新)

var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

上面得代码相当于

var name = 'World!';
(function () {
    var name;
    if (typeof name === 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

  2.看下第二个示例

var str = 'World!';   
(function (name) {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})(str);




//Hello World 因为name已经变成函数内局部变量

23.Switch (2021/10/27)

// 写一个方法

function showCase(value) {
    switch(value) {
    case 'A':
        console.log('Case A');
        break;
    case 'B':
        console.log('Case B');
        break;
    case undefined:
        console.log('undefined');
        break;
    default:
        console.log('Do not know!');
    }
}

  1.

showCase(new String('A'))


// 答案是 'Do not know'


解析: switch 是严格比较,String 实例 和 字符串不一样
        所以一般情况下,写switch语句的时候,都建议写 default

  2.


showCase(String('A')) 答案: Case A String('A') 就是返回一个字符串

24, %运算符

function isOdd(num) {
    return num % 2 == 1;
}
function isEven(num) {
    return num % 2 == 0;
}
function isSane(num) {
    return isEven(num) || isOdd(num);
}
var values = [7, 4, '13', -9, Infinity];
values.map(isSane);
 答案:
 
    [true, true, true, false, false]
  解析:
    % 如果不是数值会调用 Number() 去转化
    
        '13'%2    // 1
        Infinity%2    // NaN,Infinity 是无穷大
        -9%2        // -1
        9%-2        // 1,余数的正负号随第一个操作数

      余数和被除数同号

      14 ÷ -3 = -4 ··· 2

      -14 ÷ -3 = 4 ··· -2

      -14 ÷ 3 = -4 ··· -2

     
      -14 ÷ 3 = -4...-2 (余数符号和被除数符号必须相同)
      
    详情解析查看:https://blog.csdn.net/qq_34115899/article/details/79683041

25.运算

   1.数组的原型

    Array.isArray(Array.prototype);

    答案:true

    Array。prototype是一个数组,数组的原型是数组,对象的原型是对象,函数的原型是函数

  2.==

    [] == []

    答案:false

    两个引用类型,== 比较的是引用地址

  3. == 和 ! 优先级

  [] == ![]

    答案:true

    ! 优先级高于 == ,右边Boolean([])是true,取返等于false

    一个引用类型和一个值去比较,把引用类型转化成值类型,左边为0

    所以是在比较 0 == false   答案 true

    

  4.加减运算符,字符串与数字

    '5' + 3
    '5' - 3

    答案: 53   2

    加号有拼接功能,减号是逻辑运算

    巩固: typeof(+'1') // ’number' , 对非数值+-常被用来做类型转换,相当于Number()

    1 + - + + + + - + 1   // 2 , + - 又是一元加减操作符号,数学中的正负号,负负得正。

  5.

        var ary = Array(4);
        ary[0] = 22;
     ary[3] = 2323; ary.map(i=>'1')

    答案:['1', empty * 2, '1']

    虽然ary的长度为3,但是存在两个没有内容的,array 上的操作会跳过这些

   6.数组比较大小

    var a = [1, 2, 3];
    var b = [1, 2, 3];
    var c = [1, 2, 3];

    a == b;
    a === b;
    a > c;
    a < c;

  答案:false  false  false  true

    相等(==)和全等(===)比较的是引用地址,引用间的大小比较是按照字典序比较,先比较第一项,再比第二项...

  7.三元运算符的优先级

   // 计算打印结果 
  var val = 'zhangning';
  console.log('Value is ' + (val === 'zhangning') ? 'aaaaa' : 'bbbbb');

  答案:aaaaa

    字符串拼接比三目运算有更高的优先级

    题意为:'Value is true' ? 'aaaaa' : 'bbbbb'

    而不是:'Value is' + (true ? 'aaaaa' : 'bbbbb')

原文地址:https://www.cnblogs.com/zhangning187/p/jszjmst21-40zn187.html