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

原文: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). 

 1 function Person(name) {
 2   this.name = name;
 3 }
 4
 5 var person = Person(‘John‘);
 6 console.log(person); // undefined
 7 console.log(person.name); // Uncaught TypeError: Cannot read property ‘name‘ of undefined
 8
 9 var person = new Person(‘John‘);
10 console.log(person); // Person { name: "John" }
11 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)分隔。

  

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

  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

原文地址:https://www.cnblogs.com/souvenir/p/8507623.html

时间: 2024-10-05 19:58:08

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

Web前端笔试面试题汇总(转自github)

前言 本文总结了一些优质的前端面试题(多数源于网络),初学者阅后也要用心钻研其中的原理,重要知识需要系统学习,透彻学习,形成自己的知识链.万不可投机取巧,只求面试过关是错误的! 面试有几点需注意: 1.面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方     向↑. 2.题目类型: 技术视野.项目细节.理论知识题,算法题,开放性题,案例题. 3.进行追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延     展题目的区分度和深度,知道你的实际能力.因为这种关

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

题目如下: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; var getName = function () { alert (4);}; function getName() { alert (5);} //请写出以下输

整理出来的前端js面试题

15.HTTP状态码    100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 200  OK   正常返回信息 201  Created  请求成功并且服务器创建了新的资源 202  Accepted  服务器已接受请求,但尚未处理 301  Moved Permanently  请求的网页已永久移动到新位置. 302 Found  临时性重定向. 303 See Other  临时性重定向,且总是

前端js面试题

以下都是网上整理出来的JS面试题,答案仅供参考. /2,截取字符串abcdefg的efg//alert('abcdefg'.substring(4)); //3,判断一个字符串中出现次数最多的字符,统计这个次数/*var str = 'asdfssaaasasasasaa';var json = {}; for (var i = 0; i < str.length; i++) {        if(!json[str.charAt(i)]){                json[str.c

内置对象,原生对象和宿主对象

js内置对象是ECMAScript规范中要求实现的一些函数和对象,具体包括Object,Function,Number,Boolean,Array, String,RegExp,Error,Date,Global,Math.其中,Math比较特殊,是一个静态类,而不是构造函数.这些对象(函数) 在js引擎初始化时就已经定义完毕,可以直接在程序中或者函数上下文使用. 原生对象包括内置对象,也包括运行时创建的对象,比如用户类等. 而宿主对象则是js代码所在运行环境提供的对象,运行在浏览器上的js,其

web前端常见面试题汇总

一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器得到html代码 e. 浏览器解析html代码,并请求html代码中的资源 f. 浏览器对页面进行渲染呈现给用户 参考<一次完整的HTTP事务是怎样一个过程> 1.2.谈谈你对前端性能优化的理解 a. 请求数量:合并脚本和样式表,CSS Sprites,拆分初始化负载,划分主域 b. 请求带宽:开

你不知道的前端js面试题

1. 为什么要尽量少使用iframe? Iframes 阻塞页面加载 及时触发 window 的 onload 事件是非常重要的.onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕.当 onload 事件加载延迟后,它给用户的感觉就是这个网页非常慢. window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发.在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种

前端js函数中直接获取springmvc后台model中传值

背景:使用springboot +springmvc +thymeleaf想在前端js中直接获取后台model传的值 有两种方式: 1.使用隐藏域,先把model的值通过标签的方式放到某个input标签下,再到js中通过jquery按照id的方式选取(这种方法对于对象类型的传值支持不好,字符串什么的还可以) 1.后台传值: model.addAttribute("roles", allRoleInfos); 2.前台隐藏域接收: <input type="hidden&

JS中数据类型及原生对象简介

js是一种专门设计用来给网页增加交互性的编程语言,它的技术体系包含了一下几个方面: 1.JavaScript核心语言定义:包括数据类型,变量,常量,运算符,语句等. 2.原生对象和内置对象 3.浏览器对象BOM 4.文档对象类型DOM 5.事件处理模型 将js添加到文档中的方法有三种: 1.内嵌式 2.将js源文件通过<script>元素的src属性连接到XHTML文档中 3.脚本包含在XHTML事件处理属性中,例如onclick js的数据类型分为原始数据类型和引用数据类型: 一.原始数据类