JavaScript 的核心语法包括?
基本的语法构造(比如变量、操作符、控制结构、语句、注释)和标准库(就是一系列具有各种功能的对象比如Array、Date、Math等)
浏览器提供JavaScript 调用的额外 API有哪几类?
- BOM(Browser Object Model) 浏览器控制类:操作浏览器
- DOM(Document Object Model) 页面文档操控类:操作网页的各种元素
DOM的最小组成单位叫做节点(node),js提供了许多获取和操作节点的方法 - Web 类:实现互联网的各种功能,http协议,websocket
JavaScript 的复杂性体现在哪两个方面?
- JavaScript 要发挥作用,需要掌握大量的外部 API,几乎涉及网络应用的各个方面,掌握它们绝非易事。
- JavaScript 语言有一些设计缺陷,学习 JavaScript,很大一部分时间是用来搞清楚哪些地方有陷阱。
为何要发明CoffeeScript、TypeScript、Dart 等类JS语言?
因为JS语言设计坑太深,有时为了更合理地编写 JavaScript 程序,就不能用 JavaScript 来写,不得不发明新的语言。
- TypeScript 是一种微软开源的编程语言。由于JavaScript是弱类型的,TypeScript为JavaScript扩展类和模块的概念。正是由于TypeScript最大的特点是类型化,因此才叫做TypeScript。
- 和TypeScript 相似的工具语言还有很多,主要分为两个阵营:
一个是类似 Babel 的阵营,坚持JavaScript 的语法风格编写,为开发者提供最新的 ECMAScript 特性。
另一个则是Coffeescript、Dart等的阵营,它们的语法与 JavaScript 迥然不同,但最终会编译为JavaScript。 - Dart最初是由 Google 的 Chrome V8 团队打造。与TypeScript编译JavaScript代码不同,Dart是跳过翻译的步骤,直接在浏览器里面嵌入一个 Dart 解释引擎与 V8 并行。
JavaScript 与 Java 的区别和联系?
- 联系:JavaScript 的基本语法和对象体系,是模仿 Java 而设计的。
- 区别:
- JS的函数是一种独立的数据类型;
- JS采用基于原型对象(prototype)的继承链;
- Java 语言需要编译,而 JS 则是运行时由解释器直接执行;
JavaScript 与 ECMAScript 的关系?
ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。ECMAScript 只用来标准化 JavaScript 这种语言的基本语法结构,与部署环境相关的标准都由其他标准规定,比如 DOM 的标准就是由 W3C组织制定的。
什么是语句?
语句(statement)是为了完成某种任务而进行的操作;
语句和表达式的区别?
前者主要为了进行某种操作,一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。表达式不需要分号结尾,一旦在表达式后面添加分号,则 JavaScript 引擎就将表达式视为语句。
为何说JavaScript 是一种动态类型语言?
因为变量的类型没有限制,变量可以随时更改类型。
什么是变量提升?
由于JS引擎先解析后运行代码,所以所有变量的声明语句,都会被提升到代码的头部,这就是变量提升。
为何有些开发者习惯将常量写在运算符的左边?
避免不小心将相等运算符写成赋值运算符而引起的未知bug,通过报错提前发现。
if (x = 2) { // 不报错
if (2 = x) { // 报错
为何switch每个case代码块内部的break语句不能少?
否则会接下去执行下一个case代码块,而不是跳出switch结构。
为何switch进行比较时不会发生类型转换?
switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==)。
break 语句和 continue 语句的作用?
跳转作用,可以让代码不按既有的顺序执行。
JavaScript 的数据类型有?
数值、字符串、布尔值三种基本类型,对象这一种复杂类型,undefined和null 两个特殊值,以及ES6 新增的第七种 Symbol 类型。
JavaScript 的“函数式编程”的基础是?
把函数当成一种数据类型,可以赋值给变量
JS中确定一个值是什么类型的方法有?
- typeof运算符
- instanceof运算符
- Object.prototype.toString方法
为何typeof 用来检查一个没有声明的变量不报错?
因为 typeof undefined // "undefined"
为何typeof null返回object?
历史原因造成的,一开始没考虑null,只把它当作object的一种特殊值,后来null独立出来,作为一种单独的数据类型,但需要兼容以前的代码,所以你懂的。。。
null 和 undefined 的区别?
null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
谈谈你对JS转换规则的理解?
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
空数组([])和空对象({})对应的布尔值是?
都是true
为何说JavaScript 语言的底层根本没有整数?
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。1 === 1.0 // true
为何JS中任何一个数都有一个对应的负值?
JavaScript 的64位浮点数之中,有一个二进制位是符号位。
+0 和 -0的区别?
几乎所有场合,正零和负零都会被当作正常的0。唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。
NaN的作用是?
主要是用于将字符串解析成数字出错的场合。NaN不是独立的数据类型,而是一个特殊数值,typeof NaN。NaN === NaN // false
parseInt 需要注意的有?
- 字符串头部有空格,空格会被自动去除;
- 参数不是字符串,则会先转为字符串再转换;
- 遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分;
- 第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN;
- 返回值只有两种可能,要么是一个十进制整数,要么是NaN;
- 如果第二个参数是0、undefined和null,则直接忽略;
为何使用isNaN之前,最好判断一下数据类型?
因为isNaN只对数值有效,如果传入其他值,会被先转成数值。当isNaN为true的值,有可能不是NaN。
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
// 更可靠
function myIsNaN(value) {
return value !== value;
}
很多项目约定 JavaScript 语言的字符串只使用单引号?
因为HTML 语言的属性值使用双引号,使用双引号的话需要转义。
如何把长字符串分成多行?
在每一行的尾部使用反斜杠
字符串与数组的关系?
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符,但是无法改变字符串之中的单个字符和length属性。
什么是对象?
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
对象的所有键名加不加引号都可以?
因为对象的所有键名都是字符串
如何理解对象的引用?
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
如果行首是一个大括号,它到底是表达式还是语句?
JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块。如果要解释为对象,最好在大括号前加上圆括号。
为何数值键名不能使用点运算符?
因为会被当成小数点,只能使用方括号运算符。
什么时候delete命令会返回false?
该属性存在,且不得删除
delete命令可以删除对象的所有属性吗?
只能删除对象本身的属性,无法删除继承的属性,即使delete返回true,该属性依然可能读取到值。
in运算符的问题?
不能识别哪些属性是对象自身的,哪些属性是继承的。可以使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性。
for...in循环有使用注意点有?
- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性。
什么是函数?
函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。
JavaScript 三种声明函数的方法?
- function 命令
- 函数表达式
- Function 构造函数(非常不直观,几乎无人使用)
什么是递归?
函数调用自身
为何凡是可以使用值的地方,就能使用函数?
因为JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。
如果同时采用function命令和赋值语句声明同一个函数?
总是采用赋值语句的定义
函数name属性和函数的length属性的作用?
获取参数函数的名字和参数个数,函数的length属性与实际传入的参数个数无关,只反映函数预期传入的参数个数。
函数的toString方法
返回一个字符串,内容是函数的源码。
什么是作用域?
指的是变量存在的范围
如果在函数体内修改参数值,会不会影响到函数外部?
- 如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递,不影响;
- 如果是复合类型的值(数组、对象、其他函数),传递方式是传址传递。在函数内部修改参数,将会影响到原始值;
- 如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值;
为何要有arguments对象?
由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
如何理解闭包?
定义在一个函数内部的函数,本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的用处?
- 读取函数内部的变量
- 让这些变量始终保持在内存中
- 封装对象的私有属性和私有方法
为何不能滥用不能滥用闭包?
内存消耗会很大,造成网页的性能问题。
使用立即执行的函数表达式的目的?
- 一是不必为函数命名,避免了污染全局变量;
- 二是 IIFE 内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
数组需要注意的是?
- 由于数组本质上是一种对象,所以可以为数组添加属性,但是这不影响length属性的值
- 如果数组的键名是添加超出范围的数值,该键名会自动转为字符串,且length属性没有发生变化。
- for...in不仅会遍历数组所有的数字键,还会遍历非数字键;
- 使用delete命令删除一个数组成员,会形成空位,并且不会影响length属性;
数组的某个位置是空位与某个位置是undefined的区别?
如果是空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。