在本文中,我们将讨论我认为 JavaScript 最重要、最独特的一些特性。
1、函数是独立的行为单元
函数是基本单位,但这里重要的一点是,函数是独立的!在 Java 或 C# 等其他语言中,函数必须在类内声明,但在 JavaScript 中不是这样的。
函数可以在全局中被定义,也可以在模块里定义为可重用的单位。
2、对象是属性的动态集合
对象实际上只是属性的集合。在其他语言中,它们被称为 Map、HashMap 或 HashTable。
对象是动态的,即一旦创建,就可以添加、编辑或删除属性。
下面是一个使用字面量语法定义的简单对象。它有两个属性:
const game = {
title : 'Settlers',
developer: 'Ubisoft'
}
3、对象继承自其他对象
如果你曾经使用的语言是类似于 Java 或 C# 等基于 class
的语言,你可能习惯于从其他 class
继承 class
。但是,JavaScript 不是这样的。
对象继承自称为 prototypes
的对象。
如前所述,在这种语言中,对象是属性的集合。当创建一个对象时,他有一个名为 __proto__
的隐藏属性,它引用其他对象。这个被引用的对象称为 prototype
。
下面是一个创建空对象的例子(可以说,没有属性的对象):
const obj = {};
即使 obj 看起来是空的没有任何属性,它实际上也是有一个隐藏属性 __proto__
的:
obj.__proto__ === Object.prototype;
//true
在这类对象上,我们可以访问还没有定义的方法,例如 toString
方法,即使我们还没有定义这样的方法。这怎么可能呢?
此方法继承自 Object.prototype
。当尝试访问该方法时,JS 引擎首先尝试在当前对象上查找该方法,然后再查找其原型上的属性。
不要被 class
关键字误导了。class
只是原型系统的语法糖,帮助来自基于 class
语言的开发者熟悉 JavaScript。
4、函数就是值
在 JavaScript 中,函数就是值。就像其他值一样,函数可以赋值给变量:
const sum = function(x,y){ return x + y }
这在其他编程语言中是做不到的。
与其他值一样,函数可以传递给不同的函数或被函数返回。下面是一个函数返回另一个函数的示例:
function startsWith(text){
return function(name){
return name.startsWith(text);
}
}
const games = ['Fornite', 'Overwatch', 'Valorant'];
const newGames = games.filter(startsWith('Fo'));
console.log(newGames);
//["Fornite"]
在同一个示例中,我们可以看到 startsWith
函数返回的函数是如何作为参数发送到 filter
数组方法的。
5、函数可以闭包
函数内部可以定义函数。内部函数可以引用其他函数的变量。
而且,外部函数执行后,内部函数可以引用外部函数的变量。下面是关于这方面的例子;
function createCounter(){
let x = 0;
return function(){
x = x + 1;
return x;
}
}
const count = createCounter();
console.log(count());//1
console.log(count());//2
console.log(count());//3
count
函数可以从 createCounter
父函数访问 x
变量,即使在执行之后也是如此。count
就是闭包函数。
6、基本数据类型被视为对象
JavaScript 把基本类型当作对象,从而给人一种错觉。实际上,基本类型并不是对象. 基本类型不是属性的集合。
然而,我们可以在基本类型上调用方法。比如,我们可以在字符串上调用 toUpperCase
方法:
const upperText = 'Minecraft'.toUpperCase();
console.log(upperText);
//'MINECRAFT'
像 Minecraft
这样的简单文本是基本类型,自身没有任何方法。不过 JavaScript 会使用内置的 String 构造函数将其转换为对象,然后我们就能够对新创建的对象执行 toUpperCase
方法。
通过在底层把基本类型转换为包装对象,JavaScript 允许你调用方法,从而视它们为对象。
7、JavaScript 是一种单线程语言
JavaScript 单线程的。这意味着在特定时间只执行一条语句。
在主线程中,两个函数不能同时执行。
你也许听说过像 web workers 这种并行执行函数的方式,但是 workers 不会和主线程共享数据。它们只通过信息传递来通信 —— 什么都不是共享的。
这就容易理解了,我们只需要注意让函数执行更快就好了。耗费长时间去执行一个函数会让页面无响应。
谢谢阅读。编码快乐!
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!