原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questions.md

最近将持续翻译JavaScript面试题,希望对各位有所帮助。  

(文章中斜体字部分为译者添加)

目录:

Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)

Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)

Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)

  1、宿主对象与原生对象有何区别?

  原生对象是指JavaScript中按照ECMAScript规范进行定义的对象,比如:String,Math,RegExp,Object,Function等等。

  宿主对象是指由JavaScript的运行环境(浏览器或者是node)提供的对象,比如window,XMLHTTPRequest等等。

  引用文档:

  https://stackoverflow.com/questions/7614317/what-is-the-difference-between-native-objects-and-host-objects

  2、以下函数调用方式有何不同:function Person(){},var person = Person(),以及var person = new Person()  

  这个问题让人相当困惑。我猜测这道题主要是要考JavaScript中的构造函数。从技术上讲,function Person(){} 只是一个普通的函数声明。通常我们使用帕斯卡命名法来给构造函数命名。

  var person = Person() 这种只是把Person作为一个函数来调用,而不是一个构造器。想用这种方式来将函数作为构造器调用是一种非常常见的错误。一般来说,构造器没有任何返回值。因此,如果把一个构造器当成一个普通函数来调用,并且把返回值赋值给一个变量,那么值会是undefined。

  var person = new Person() 通过new操作符来创建一个Person对象的实例,并且继承了Person.prototype属性。也可以通过Object.create来创建实例,比如 Obejct.create(Person.prototype). 

 function Person(name) {
this.name = name;
} var person = Person('John');
console.log(person); // undefined
console.log(person.name); // Uncaught TypeError: Cannot read property 'name' of undefined var person = new Person('John');
console.log(person); // Person { name: "John" }
console.log(person.name); // "john"

  引用文档:

  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

  

  3、call与apply有什么区别?

  call与apply都可以用来调用一个函数,第一个传入的参数是函数内部this对象。call方法的后面的参数是使用逗号进行分隔区分,apply是用的数组。速记方法:C 是call方法逗号(comma)分隔,A是apply数组(array)分隔。

  

 function add(a, b) {
return a + b;
} console.log(add.call(null, 1, 2)); //
console.log(add.apply(null, [1, 2])); //

  4、Function.prototype.bind 有何作用

  引用MDN的原文解释:

  bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

  以我的经验来看,它最大的作用就是当需要传递一个函数作为其他函数的入参是,它可以绑定方法中的this值。最常用的就是React中的组件。

  引用文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

  

  5、何时使用document.write()

  document.write()会向document.open()打开的文档流中写入一段字符串文本。如果document.write()调用时文档已经加载了,那么他会调用document.open方法来清除怎么文档(<head>与<body>标签内的内容都将被移除),然后用传入的字符串替换整个内容区。因此在使用的时候要慎重考虑,以免出错。

  网上也有一些关于document.write的其他用法,比如用在代码分析,或者在一个只能使用JavaScript的环境中引入样式。它也被经常用到HTML5模板文件中来并行加载脚本文件,保持代码执行顺序。不过对于这些观点我仍然不太赞同,因为在现代化的今天,我们有更多更好的方法来替换document.write()。

  引用文档:

  https://www.quirksmode.org/blog/archives/2005/06/three_javascrip_1.html

  https://github.com/h5bp/html5-boilerplate/wiki/Script-Loading-Techniques#documentwrite-script-tag

前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)的更多相关文章

  1. 前端JS面试题汇总 Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  2. [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  3. 2016 JS 笔试题汇总:

    1 1 1 CS&S(中软国际): 1 JavaScript 循环表达式: 2  JavaScript表达式boolean返回值: 3 网页中的事件/HTML 事件属性/JavaScript ...

  4. 170104、js内置对象与原生对象

    内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集:而后者包括了一些在运行过程中动态创建的对象. 原生对象 ...

  5. 一道常被人轻视的前端JS面试题

    前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多 ...

  6. 一道常被人轻视的前端JS面试题(转)

    分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多难只是因为大多面试者过 ...

  7. 前端JS面试题

    题目如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function ( ...

  8. WEB前端常见面试题汇总:(一)

    1.JS找字符串中出现最多的字符 例如:求字符串'nininihaoa'中出现次数最多字符 方法一: var str = "nininihaoa"; var o = {}; for ...

  9. web前端常见面试题汇总

    一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器 ...

随机推荐

  1. java面向对象基础(四):抽象类和接口

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. java判断网页的编码格式

    在爬取内容时,遇到乱码问题.故需对网页内容编码格式做判断,方式大体分为三种:一.从header标签中获取Content-Type=#Charset:二.从meta标签中获取Content-Type=# ...

  3. 【转】sed & awk常用正则表达式

    正则表达式元字符 正则表达式中有两种基本元素: 以字面值或变量表示的值(如.代表任意单个字符). 操作符(如*代表将前面的字符重复任意次). 元字符汇总 特殊字符 用途 . 匹配除换行符以外的任意单个 ...

  4. PYTHON3 中的虚假四舍五入:round()

    PYTHON3 中的虚假四舍五入:round() 创建时间: 2017/12/5 17:08 作者: CN_Simo 标签: python基础, round, 四舍五入 一.这不是一个BUG! 在使用 ...

  5. mysql将查询出来的一列数据拼装成一个字符串

    使用GROUP_CONCAT函数. SELECT GROUP_CONCAT(查询的字段 separator ',') FROM table

  6. 安装RRDtool 1.4.5

    安装rrdtoolRrdtool安装需要cairo.libxml2.pango库支持,可通过yum安装安装libart_lgpl-devel这个包yum -y install libart_lgpl- ...

  7. ffmpeg命令行循环推流

    用ffmpeg循环推一个文件到rtmp服务器.一般都是建议用-stream_loop选项.如: ffmpeg -threads -re -fflags +genpts -stream_loop - - ...

  8. dubbo 线程池

    在dubbo调用过程中被调用方有两个线程池:io线程池,业务线程池. 这也是dubbo调优的点. 配置信息: <dubbo:protocol name="dubbo" dis ...

  9. 修改Java程序的进程名

    1.修改tomcat进程名字: 当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么如何 ...

  10. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...