美文网首页前端回炉重造
JavaScript 数据类型2

JavaScript 数据类型2

作者: Vychod | 来源:发表于2021-01-12 14:35 被阅读0次

数据类型

函数

4.5 arguments 对象

  1. 定义
  2. 与数组的关系
var args = Array.prototype.slice.call(arguments);

// 或者
var args = [];
for (var i = 0; i < arguments.length; i++) {
  args.push(arguments[i]);
}
  1. calle 属性
    arguments对象带有一个callee属性,返回它所对应的原函数。
var f = function () {
  console.log(arguments.callee === f);
}

f() // true

5.函数的其他知识点

5.1 闭包

闭包(closure)是 JavaScript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

闭包的最大用处有两个,一个是可以读取外层函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。

function createIncrementor(start) {
  return function () {
    return start++;
  };
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7

闭包的另一个用处,是封装对象的私有属性和私有方法。

注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。

5.2 立即调用的函数表达式(IIFE)

当作表达式时,函数可以定义后直接加圆括号调用。

var f = function f(){ return 1}();
f // 1

上面的代码中,函数定义后直接加圆括号调用,没有报错。原因就是function作为表达式,引擎就把函数定义当作一个值。这种情况下,就不会报错。

函数定义后立即调用的解决方法,就是不要让function出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。

(function(){ /* code */ }());   // 分号是必须的
// 或者
(function(){ /* code */ })();

通常情况下,只对匿名函数使用这种“立即执行的函数表达式”。它的目的有两个:一是不必为函数命名,避免了污染全局变量;二是 IIFE 内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

6.eval命令

6.1 基本用法
eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。

eval('var a = 1;');
a // 1

如果eval的参数不是字符串,那么会原样返回。

eval没有自己的作用域,都在当前作用域内执行,因此可能会修改当前作用域的变量的值,造成安全问题。

为了防止这种风险,JavaScript 规定,如果使用严格模式,eval内部声明的变量,不会影响到外部作用域。

(function f() {
  'use strict';
  eval('var foo = 123');
  console.log(foo);  // ReferenceError: foo is not defined
})()

不过,即使在严格模式下,eval依然可以读写当前作用域的变量。

通常情况下,eval最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的JSON.parse方法。
6.2 eval 的别名调用

数组

1. 定义
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。

2. 数组的本质
本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object

3. length 属性
数组的length属性,返回数组的成员数量。
JavaScript 使用一个32位整数,保存数组的元素个数。这意味着,数组成员最多只有 4294967295 个(232 - 1)个,也就是说length属性的最大值就是 4294967295。
清空数组的一个有效方法,就是将length属性设为0

4. in 运算符
检查某个键名是否存在的运算符in,适用于对象,也适用于数组。
注意,如果数组的某个位置是空位,in运算符返回false。

5. for...in 循环和数组的遍历
使用 forEach 遍历数组

var colors = ['red', 'green', 'blue'];
colors.forEach(function (color) {
  console.log(color);
});
// red
// green
// blue

6. 数组的空位

var a = [1, , 1];   // length 为 3
var a = [1,2, 3,];   // length 为 3

空位就是数组没有这个元素,所以不会被遍历到,而undefined则表示数组有这个元素,值是undefined,所以遍历不会跳过。

7. 类似数组的对象
如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)

var obj = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3
};

obj[0] // 'a'
obj[1] // 'b'
obj.length // 3
obj.push('d') // TypeError: obj.push is not a function

“类似数组的对象”的根本特征,就是具有length属性。只要有length属性,就可以认为这个对象类似于数组。但是有一个问题,这种length属性不是动态值,不会随着成员的变化而变化。

相关文章

网友评论

    本文标题:JavaScript 数据类型2

    本文链接:https://www.haomeiwen.com/subject/yyasaktx.html