JavaScript 小知识

undefined 和 null 有什么区别?


  • undefined:表示一个值未被定义。典型用法:
    (1)变量被声明了,但没有赋值时,就等于 undefined。
    (2) 调用函数时,应该提供的参数没有提供,该参数等于 undefined。
    (3)对象没有赋值的属性,该属性的值为 undefined。
    (4)函数没有返回值时,默认返回 undefined。

  • null:表示一个值被定义为“空值”。典型用法:
    (1) 作为函数的参数,表示该函数的参数不是对象。
    (2) 作为对象原型链的终点。




解释 JavaScript 中的值和类型?


  • 基本数据类型
    String
    Number
    Boolean
    Null
    Undefined
    Symbol(ES6)
  • 复杂数据类型
    Object




JavaScript 的 typeof 返回值有哪些?


  • "undefined"
  • "boolean"
  • "string"
  • "number"
  • "object" (如果这个值是对象或null)
  • "function" (如果这个值是函数)




以下代码输出的结果是什么?


  0.1 + 0.2 === 0.3

这段代码的输出是 false,这是由浮点数内部表示导致的。0.1 + 0.2 并不刚好等于 0.3,实际结果是 0.30000000000000004。解决这个问题的一个办法是在对小数进行算术运算时对结果进行舍入。




为什么在 JS 中比较两个相似的对象时返回 false?


  let a = { a: 1 };
  let b = { a: 1 };
  let c = a;

  console.log(a === b); // false
  console.log(a === c); // true

JS 在比较对象时,是通过比较对象在内存中的存储地址。
因此, a 与 b 是放在不同的引用地址,返回 false;a 与 c 是存放在相同的引用地址,返回 true。




深浅拷贝?


深浅拷贝只是针对引用类型的,因为引用类型是存放在堆内存中,在栈地址有一个或者多个地址来指向堆内存的某一数据

  • 浅拷贝
    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
    浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象,如果你修改了“副本”的值,那么原来的对象也会被修改

    let arr = [22, 44, 66, 88];
    let co = arr;
    co[0] = 11;
    console.log(arr, co);  // [11,44,66,88]  [11,44,66,88]
    
  • 深拷贝
    深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
    深拷贝把要复制的对象所引用的对象都复制了一遍。如果你修改了“副本”的值,那么原来的对象不会被修改,两者是相互独立的。




如何在一行中计算多个表达式的值?


可以使用逗号运算符在一行中计算多个表达式。 它从左到右求值,并返回右边最后一个项目或最后一个操作数的值。

  let x = 5;
  x = (x++, x = addFive(x), x *= 2, x -= 5, x += 10);
  function addFive(num) {
    return num + 5;
  }

因此,上述操作最终返回 27。
计算步骤如下:

  x = 5;
  x++:进行了自增,得到 x = 6;
  x = addFive(x):传入参数 6,得到 x = 11;
  x *= 2:进行了乘法操作,得到 x = 22;
  x -= 5:进行减法操作,得到 x = 17;
  x += 10:进行加法操作,得到 x = 27。




JavaScript 中的虚值是什么?如何检查是否为虚值?


  • 虚值:可以简单理解为转换为布尔值变为 false 的值。
    const falsyValues = ['', 0, null, undefined, NaN, false];
    
  • 检查方法
    使用 Boolean 函数或者 !! 运算符。




如何理解 JS 中的 this 关键字?


  • 介绍
    this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
  • 绑定规则
    1. 默认绑定
    独立函数的调用。可以把这条规则看作是无法应用其他规则的时的默认规则。
      function foo() { console.log(this.a) }
      var a = 2
      foo() // 2
    
    2. 隐式绑定
    调用位置是否有上下文对象。
      function foo() { console.log(this.a) }
      var obj = { 
        a: 2,
        foo: foo
      }
      obj.foo() // 2
    
    3. 显示绑定
    使用 call()、apply()、bind()绑定
      function foo() { console.log(this.a) }
      var obj = {
        a: 2
      }
      foo.call(obj) // 2
    
    4. new 绑定
      function foo(a) { this.a = a }
      var bar = new foo(2)
      console.log(bar.a) // 2
    
  • 优先级
    4 > 3 > 2 > 1




事件委托是什么?


对“事件处理程序过多”问题的解决方案就是事件委托。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。




作用域是什么?


作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是为了对变量进行赋值,那么就会使用 LHS 查询。如果目的是为了获取变量的值,就会使用 RHS 查询。




什么是闭包?


  • 定义
    当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
      function foo () {
          var a = 2
          function bar() {
              console.log(a)
          }
          return bar
      }
    
      vra baz = foo()
      baz() // 2
    




原型链


  • 定义
    每个实例对象( object )都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( proto ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。




解释一下变量的提升?


引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。
这个过程,就像把变量和函数声明从它们在代码中出现的位置被移动到了最上面,这个过程就叫做提升。
函数声明和变量声明都会被提升,优先级是函数会首先被提升,然后才是变量。




如何理解高阶函数?


既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
一个简单的高阶函数定义:

function add(x, y, f) {
    return f(x) + f(y);
}




如何区分声明函数和表达式函数?


区分函数声明和表达式最简单的方法是看function关键字出现在声明中的位置(不仅仅是一行代码,而是整个声明中的位置)。如果function是声明中的第一个词,那么就是一个函数声明,否则就是一个函数表达式。




什么是 IIFE(立即调用函数表达式)?


由于函数被包含在一对()括号内部,因此成为了一个表达式,通过在末尾加上另外一个()可以立即执行这个函数,比如(function foo() { .. })()。第一个()将函数编程表达式,第二个()执行了这个函数。

  (
    function foo() {
      var a = 3
      console.log(a)
    }
  )()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容