爱客仕-前端团队博客园

前端开发中的不确定性杂谈

引言

我们常说凡事皆有两面性,其实也就是说凡事都具有不确定性,今天我们就来说说前端开发中的这种不确定性。

Checkbox的不确定性

大家都知道Checkbox有两种状态:选中和未选中。这在实际应用中一般是没有问题的,但是如果应用目标包含多个子级,就会出现问题:比如一个文件夹,假设里面有10个文件,如果全部选中这10个文件,我们可以说它是“选中”的;如果一个文件也不选,我们可以说它是“未选中”的;但是如果只选中其中5个文件,那么我们该如何描述呢?

显而易见,这个时候这个文件夹的状态具有不确定性。那么如何表示这种不确定性状态呢?事实上,Checkbox元素已经有一个叫做indeterminate的属性(property)可以用来表示这种不确定性状态了。

想了解更多详情,请查看这篇文章:Indeterminate Checkboxes

JavaScript变量的不确定性

首先我们来定义一个变量foo:

1
var foo;

我们都知道这个变量等于undefined

1
2
console.log(foo === undefined);
// > true

现在我们假设有一个变量bar,但是我们并没有实际定义这个变量,我们不妨称之为“虚变量”。那怎么访问这个“虚变量”呢?我们知道JavsScript执行时有一个上下文对象this,我们可以用this.bar来访问它。

那么问题来了,你觉得下面这行代码的输出结果是怎么样的?

1
2
console.log(this.bar === foo);
// > ?

如果你测试一下就会发现结果是true!是不是有点不合逻辑?一个未定义(或者说完全不存在)的变量(“虚变量”)竟然会等于一个已定义的变量(“实变量”)!

现在我们来简单梳理一下:

  1. 一个未定义的变量等于undefined,这是可以理解的。
  2. 一个已定义且已赋值的变量,等于其对应值,这也是可以理解的。
  3. 一个已定义但未赋值的变量,应该等于什么?

显而易见,这个时候这个变量的值具有不确定性。那么JavsScript里面有没有什么东西可以表示这种状态呢?目前好像没有。

所以我觉得未来的JavsScript应该考虑到这样情况,提供相应的标识符来表示这种状态。比如说增加一个全局属性indeterminate,所有已定义但未赋值的变量都等于这个值:

1
2
3
4
5
6
7
var foo;
console.log(foo === undefined);
// > false
console.log(foo === indeterminate);
// > true

结语

总之……(此处省略一万字)

最后提个问题,下面代码的输出结果是怎么样的?
假如已经实现了上面提到的全局属性indeterminate,那么结果又可能是怎么样的?

1
2
3
4
5
6
7
8
9
10
var arr = [,undefined];
console.log(arr[0]);
// > ?
console.log(arr[1]);
// > ?
console.log(arr[2]);
// > ?