一:和数组相关的几个需要关注的点

  1. 数组可以容纳任何类型的值。

  2. 数组声明时不需要预先设置大小。可以动态改变。

  3. 使用delete运算符可以将数组中的某个元素删除,但是这个操作不会改变数组的length属性。

    var a = [1,2,3];
    a[0]; // 1
    delete a[0]; // true
    a.length; // 3
    a[0]; // undefined
  4. 稀疏数组:即含有空白或空缺单元的数组(数组中的某一项为undefined)。

  5. 我们都知道数组可以通过索引进行取值,但我们也知道数组也是对象,所以我们可以用键值对的方式给数组赋值:

    var a = [1,2,3];
    a.length; // 3
    a.name = 'abc';
    a.name; // 'abc'
    a.length; // 3

    如上所示,数组的length属性并不会发生变化,但有一种情况例外,就是如果键的值可以转换为十进制数字的话,那么这个键会被当做索引处理:

    var a = [1];
    a.length; // 1
    a['13'] = 2;
    a.length; // 14

    所以可以看出在数组中存储键值对并不是一个值得推荐的做法,还是用对象好一些。


二、类数组向数组的转换

类数组:一组通过数字索引的值。并非真正意义上的数组,但是非常相似,都是通过数字索引取值,都有length属性。

例如DOM查询操作。我们假设存在一个id为'container'的div元素,且这个div元素含有子元素:

var domContainer = document.getElementById('container');
var nodeList = domContainer.childNodes; // 返回节点类数组,NodeList,也是对象一种子类型

此时的nodeList就是一个类数组。目前的nodeList是无法调用数组的API进行处理的,所以我们需要先将其转换为真正的数组:

var trueNodeArray = [].slice.call(nodeList);    // 返回节点数组

// 同上
var trueNodeArray = Array.prototype.slice.call(nodeList);

ES6新增的Arry.form也可以实现这个转换:

var trueNodeArray = Array.from(nodeList);   // 从一个类数组或者可迭代对象中创建一个新的数组实例

三、有关字符串和数组相互转换的两个方法

在日常的开发中,我们经常需要将字符串转为数组进行处理并且在处理完后再转为字符串。之所以要进行这个转换是因为将字符串作为数组处理可以调用数组的API,在某些操作上会方便很多。

  • String.prototype.split() 可以将字符串转为数组
  • Array.from() 同上
  • Array.prototype.join() 可以将数组转为字符串

四、undefined、null和NaN

undefined类型只有一个值,即undefined。null类型也只有一个值,即null。

  • null指空值。有值,但是值为空。
  • undefined指没有值。

NaN是一个数字类型的值。本身没有任何的数学意义,唯一的作用就是告诉,这个数学运算产生了一个非数字的运算结果或者这个运算没有成功,这个结果是数字无法表示的,所以用NaN来表示。需要注意的一点是, NaN != NaN返回值为true。

如果我们需要判断运算结果是不是NaN,可以使用全局工具函数isNaN()。但是这个全局函数有个BUG,那就是非数字类型的值也会返回true。ES6新增的Number.isNaN()修复了这个问题。


五:负零,-0

JS中的0有两种,正0和负0。这两个0在大小上没有任何差别,所以这里的正负号并不是为了体现大小,而是为了体现方向。如果要区分正0和负0,可以通过如下所示的区别来进行区分:

1 / 0 === Infinity; // true
1 / -0 === -Infinity; // true

六:Object.is方法

这个方法被用来判断两个值是否是相同的值。JS提供了三种不同的方式来判断两个值是否相同,详细内容参见——JavaScript中的相等性判断

这里介绍一下Object.is比较特殊的两个地方:

Object.is(NaN, NaN);    // true
Object.is(-0, 0); // false

注意,能使用 == 和 === 的不要使用Object.is方法。因为前者效率更高。Object.is主要用来处理特殊的相等比较,返回你想要的特殊的比较结果。


七:值和引用

在JS中,赋值和参数传递操作传递的值还是引用在语法是没有区别的,完全由值得类型决定。这一点是比较特殊的。

在JS中,简单值总是通过值复制的方式来赋值或是传递的,也就是值传递。包括null、undefined、字符串、数字、布尔和ES6中的Symbol。复合值,也就是对象(包括子类型)和函数,则是通过引用复制的方式传递的,即引用传递。

注:JS中我们是无法自行决定是使用值复制还是引用复制的,一切由值得类型决定。

《You dont know JS》值相关总结的更多相关文章

  1. 05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令

     Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以再Linux终端使用. 键值相关命令: Keys:返回满足给定pattern的所有key 用表达式*表 ...

  2. js值类型转换(boolean/String/number),js运算符,if条件,循环结构,函数,三种弹出框

    js值类型转换 number | string | boolean boolean类型转换 num = 0; var b1 = Boolean(num); console.log(b1) 转化为数字类 ...

  3. js的相关距离

    js的相关距离 一.dom对象的距离 ---dom.style.width : 对象本身的内容宽度(这里必须是内联样式中的width,带px)(content) ---dom.style.height ...

  4. node.js 使用----相关常用命令总结

    node.js 使用----相关常用命令总结 1. 下载并安装node.js 2. 设置全局模块存放的目录 2.1 查看默认配置 npm config ls 2.2 修改全局模块存放目录 npm co ...

  5. JS作用域相关知识(#精)

    在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...

  6. js事件相关面试题

    说是面试题,其实也相当于是对js事件部分知识点的一个总结.简单内容一笔带过,了解详情我都给出了参考链接,都是之前写的一些相关文章.JavaScript本身没有事件模型,但是环境可以有. DOM:add ...

  7. Cornerstone.js使用相关

    官网地址:https://github.com/chafey/cornerstone 简介: Cornerstone is an open source project with a goal to ...

  8. JS - url相关

    今天在找获取当前网址除去参数的js方式,结果自己会的竟然只有window.location.href 查到的一篇博文: http://www.cnblogs.com/weiyuxinghuacun/a ...

  9. js 事件相关 事件处理 封装 事件封装 DOM 0 2 3 级事件

    1.绑定 function(element, type, handler){        if (element.addEventListener) {            element.add ...

随机推荐

  1. Python 接口测试(十)

    这里对接口测试9 进行优化升级,前端进行重构后的代码,源码已经开源 经过将近一个月的编写 , TIAPTest 接口测试平台 , 已经部署到服务器,开始运行了. http://60.205.187.1 ...

  2. 用C#实现微信“跳一跳”小游戏的自动跳跃助手

    一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时 ...

  3. 线程安全Dictionary

    public abstract class ReadFreeCache<TKey, TValue> { protected ReadFreeCache() : this(null) { } ...

  4. 2017 年终总结 & 2018 年度计划

    不立几个 Flag,都不知道怎么作死 2017 年度计划完成情况: 1.健身时间不少于350天:  未完成 中断了22天,实际运动 343天   2.至少每个月看一本书:  及格 <切尔诺贝利的 ...

  5. K:二叉树的非递归遍历

    相关介绍:  二叉树的三种遍历方式(先序遍历,中序遍历,后序遍历)的非递归实现,虽然递归方式的实现较为简单且易于理解,但是由于递归方式的实现受其递归调用栈的深度的限制,当递归调用的深度超过限制的时候, ...

  6. mysql加锁读

    Locking Reads 在同一个事务中,如果你先查询数据,随后对相关数据进行插入或修改,那么在标准的SLELECT中不会给出足够的保护.在你查询期间另一个事务可以更新或者删除相同的行.InnoDB ...

  7. 2017 年的 人生 hard 模式终于结束了,2018年回归初心

    2017 年的 人生 hard 模式终于结束了,2018年回归初心 2017年对于我个人来讲, 毫不夸张的说 算是近十年来除了高考那一年,最最惊心动魄的一年了,没有之一. >>>开篇 ...

  8. Appium python

    1.运行报错:FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.android.ime without first uninstalling ...

  9. SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?

    前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...

  10. Java集合干货——ArrayList源码分析

    ArrayList源码分析 前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体 ...