1. JavaScript 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别?

数据类型:

基本数据类型:Number、String、Boolean、undefined 、null

引用数据类型:Function、Object、Array

区别:

undefined:表示变量声明但未初始化时的值

null:表示准备用来保存对象,还没有真正保存对象的值。从逻辑角度看,null 值表示一个空对象指针

ECMA 标准要求 null 和 undefined 等值判断返回 true

null == undefined // true

null === undefined // false

2. 如何判断 JavaScript 的数据类型?

typeof

typeof可以用来区分除了 null 类型以外的原始数据类型,对象类型的可以从普通对象里面识别出函数:

typeof undefined // "undefined"
typeof null // "object"
typeof 1 // "number"
typeof "1" // "string"
typeof Symbol() // "symbol"
typeof function() {} // "function"
typeof {} // "object"// ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

问题一:typeof 不能识别 null,如何识别 null?

答案:如果想要判断是否为 null,可以直接使用===全等运算符来判断(或者使用下面 的 Object.prototype.toString 方法)

let a = null
a === null // true 

问题二:typeof 作用于未定义的变量,会报错吗?

答案:不会报错,返回"undefined"。

typeof randomVariable // "undefined" 

问题三:typeof Number(1)的返回值是什么?

答案:"number"。注意 Number 和 String 作为普通函数调用的时候,是把参数转化为 相 应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数 调用。注意和 Array 区分,Array(...)等价于 new Array(...)

typeof Number(1) // "number"
typeof String("1") // "string"
Array(1, 2, 3) // 等价于 new Array(1, 2, 3) 

问题四:typeof new Number(1)的返回值是什么?

答案:"object"。

typeof new Number(1) // "object"
typeof new String(1) // "object"

instanceof

instanceof 不能用于判断原始数据类型的数据

 3 instanceof Number // false
'3' instanceof String // false
true instanceof Boolean // false 

instanceof 可以用来判断对象的类型

var date = new Date()
date instanceof Date // true
var number = new Number()
number instanceof Number // true
var string = new String()
string instanceof String // true 

需要注意的是,instanceof 的结果并不一定是可靠的,因为在 ECMAScript7 规范中可以通过自定义 Symbol.hasInstance 方法来覆盖默认行为。

Object.prototype.toString
Object.prototype.toString.call(3).slice(8, -1) // "Number"
Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number"
Object.prototype.toString.call('3').slice(8, -1) // "String"
Object.prototype.toString.call(new String(3)).slice(8, -1) // "String"
Object.prototype.toString.call(true).slice(8, -1) // "Boolean"
Object.prototype.toString.call(new Boolean(true)).slice(8, -1) // "Boolean"
Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined"
Object.prototype.toString.call(null).slice(8, -1) // "Null"
Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol" 

由上面的示例可知,该方法没有办法区分数字类型和数字对象类型,同理还有字符串类型和字符串对象类型布尔类型和布尔对象类型

另外,ECMAScript7 规范定义了符号 Symbol.toStringTag,你可以通过这个符号自定义 Object.prototype.toString 方法的行为:

'use strict'
var number = new Number(3)
number[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(number).slice(8, -1) // "Custom"
function a () {}
a[Symbol.toStringTag] = 'Custom'
Object.prototype.toString.call(a).slice(8, -1) // "Custom"
var array = []
array[Symbol.toStringTag] = 'Custom'
Object.prototype.toString.call(array).slice(8, -1) // "Custom" 

因为 Object.prototype.toString 方法可以通过 Symbol.toStringTag 属性来覆盖默认行 为,所以使用这个方法来判断数据类型也不一定是可靠的

Array.isArray
Array.isArray(value)可以用来判断 value 是否是数组:
Array.isArray([]) // true
Array.isArray({}) // false
(function () {console.log(Array.isArray(arguments))}()) // false

3. 简述创建函数的几种方式?

第一种(函数声明)

  function sum1(num1, num2) {return num1 + num2;}

第二种(函数表达式)

  var sum2 = function (num1, num2) {return num1 + num2;}

第三种(函数对象方式)

  var sum3 = new Function("num1", "num2", "return num1+num2")

4. Javascript 创建对象的几种方式?

1、简单对象的创建使用对象字面量的方式{}

创建一个对象(最简单,好理解,推荐使用)

  var Cat = {} // JSON Cat.name = "kity" // 添加属性并赋值 Cat.age = 2Cat.sayHello = function () {alert("hello " + Cat.name + ",今年" + Cat["age"] + "岁了") // 可以使用 “.” 的方式访问属性, 也可以使用 HashMap 的方式访问 }Cat.sayHello() // 调用对象的(方法)函数

2、用 function(函数)来模拟 class

2.1) 创建一个对象,相当于 new 一个类的实例(无参构造函数)

  function Person() {}var personOne = new Person() // 定义一个 function,如果有 new 关键字去 "实例化" ,那么该 function 可以看作是一个类 personOne.name = "dylan"personOne.hobby = "coding"personOne.work = function () {alert(personOne.name + " is coding now...")}personOne.work()

2.2)可以使用有参构造函数来实现,这样定义更方便,扩展性更强(推荐使用)

  function Pet(name, age, hobby) {this.name = name // this 作用域:当前对象this.age = agethis.hobby = hobbythis.eat = function () {alert("我叫" + this.name + ",我喜欢" + this.hobby + ",也是个吃货")}}var maidou = new Pet("麦兜", 5, "睡觉") // 实例化/创建对象maidou.eat() // 调用 eat 方法(函数)

3、使用工厂方式来创建(Object 关键字)

  var wcDog = new Object()wcDog.name = "旺财"wcDog.age = 3wcDog.work = function () {alert("我是" + wcDog.name + ",汪汪汪......")}wcDog.work()

4、使用原型对象的方式 prototype 关键字

  function Dog() {}Dog.prototype.name = "旺财"Dog.prototype.eat = function () {alert(this.name + "是个吃货")}var wangcai = new Dog()wangcai.eat()

5、混合模式(原型和构造函数)

  function Car(name, price) {this.name = namethis.price = price}Car.prototype.sell = function () {alert("我是" + this.name + ",我现在卖" + this.price + "万元")}var camry = new Car("凯美瑞", 27)camry.sell()

6、动态原型的方式(可以看作是混合模式的一种特例)

  function Car(name, price) {this.name = namethis.price = priceif (typeof Car.sell == "undefined") {Car.prototype.sell = function () {alert("我是" + this.name + ",我现在卖" + this.price + "万元")}Car.sell = true}}var camry = new Car("凯美瑞", 27)camry.sell()

以上几种,是 javascript 中最常用的创建对象的方式

5. 请指出 JavaScript 宿主对象和原生对象的区别?

原生对象

独立于宿主环境的 ECMAScript 实现提供的对象

包含:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError

内置对象

开发者不必明确实例化内置对象,它已被内部实例化了

同样是“独立于宿主环境”。而 ECMA-262 只定义了两个内置对象,即 Global 和 Math

宿主对象

BOM 和 DOM 都是宿主对象。因为其对于不同的“宿主”环境所展示的内容不同。其实说白了就是,ECMAScript 官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过 ECMAScript 程序创建的对象

JavaScript基础面试题总结01相关推荐

  1. 常见JavaScript基础面试题上(附答案)

    常见JavaScript基础面试题上(附答案) 1.JavaScript有哪些垃圾回收机制? 有以下垃圾回收机制. 标记清除( mark and sweep) 这是 JavaScript最常见的垃圾回 ...

  2. JavaScript基础面试题及答案

    JavaScript基础面试题及答案① 1 介绍JavaScript的基本数据类型 3 jQurry使用建议 4 Ajax使用 5 JavaScript有几种类型的值? 6 栈和堆的区别? 7 Jav ...

  3. 50道JavaScript基础面试题(附答案)

    50道JavaScript基础面试题(附答案) 1 介绍JavaScript的基本数据类型 2 说说写JavaScript的基本规范? 3 jQuery使用建议 4 Ajax使用 5 JavaScri ...

  4. JavaScript基础面试题,h5前端开发

    标准文档流 标准文档流,指的是元素排版布局过程中,元素会默认自动从左往右,从上往下的流式排列方式.前面内容发生了变化,后面的内容位置也会随着发生变化. HTML就是一种标准文档流文件 HTML中的标准 ...

  5. 学生党必看,JavaScript基础面试题

    故事开篇: 看到一则帖子,讲一个学历只是普通的大专毕业的程序员,做前端5年左右的时间了,中间干过3家公司,都是属于中型互联网企业和创业型的公司,规模不算大.很苦恼进不了大厂,一直在中小公司里打滚天天切 ...

  6. 2019年最全面最新200+道JavaScript基础面试题(上)

    在此之前,我也跟大家分享过很多的面试题,今天我要跟大家分享的这个JavaScript的面试一共有200多道,适用于前端学习与前端求职者,面试刷题,里面涵盖的内容比较广,今天只是整理了部分面试题,希望对 ...

  7. JavaScript 基础 面试题

    目录 如何判断 JavaScript 的数据类型? 简述创建函数的几种方式? Javascript 创建对象的几种方式? JavaScript 内置的常用对象有哪些?并列举该对象常用的方法? === ...

  8. javaScript基础面试题 ---null 与 undefined

    null 与 undefined 奇怪点 原因 具体区别 奇怪点 有点奇怪的是:JavaScript语言竟然拥有两个表示"无"的值:undefined与null.这是为什么? 原因 ...

  9. JavaScript基础面试题

    第1题 var y = 1; if (function f(){}) { y += typeof f; } console.log(y); 第2题 var output = (function(x){ ...

最新文章

  1. Pycharm中导入requests模块详解
  2. 利用 .NET Framework 命令行工具
  3. dell物理服务器硬件磁盘监控
  4. python电脑配置苹果笔记本-tensorflow学习笔记1——mac开发环境配置
  5. 2019最新 iOS Native项目集成Unity3D
  6. html5新增属性有哪些,HTML5 新增属性
  7. 未清采购订单关闭最全的方法
  8. 【Python】Python处理图像五个有趣场景,很实用!
  9. AR主要生产厂商与谷歌眼镜失败分析
  10. 淘汰算法LRU是什么?
  11. 新知丨口服益生菌是商业噱头?
  12. java 基础编程题 5
  13. 利用TCN网络实现MNIST手写体数据集的识别
  14. bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
  15. shell脚本 把一个文件的内容全部转换为大写
  16. effective Java chapter 2创建和销毁对象
  17. iOS 硬件 定位 - 详解 数据的处理
  18. bat脚本修改文件内容
  19. ook的matlab,【伪技术】基于OOK的语音信号的数字传输
  20. [完]PHP 格式化显示时间 date() 函数

热门文章

  1. Enfusion在澳大利亚悉尼设立新办事处,扩大全球业务版图
  2. Squish — 基于Qt的HMI自动化测试工具
  3. 实战分布式之电商高并发秒杀场景总览
  4. git安装路径的更改
  5. Ir(II)配合物金属-配体电荷转移(3MLCT)激发态)
  6. 【Qualcomm高通音频】音效调试控件介绍_FENS
  7. 论文阅读之《Image Inpainting for Irregular Holes Using Partial Convolutions》
  8. 给你的网页添加看板娘(以给博客园博客添加看板娘为例)(保姆级图文)
  9. php邮件服务器搭建,如何快速简单的使用Linux搭建邮件服务器
  10. pytorch中交叉熵损失函数的细节