数据类型参考问题

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方法进行遍历,空位都会被跳过。

你可能感兴趣的:(数据类型参考问题)