
头像| CSDN从东方IC下载
生产 | CSDN(ID:CSDNnews)
我是一种单线程、非阻塞、异步并发语言。
我有一个调用堆栈、一个事件循环、一个回调队列和其他一些 API。
—— JavaScript
您可以让应用程序获取 API。您的按钮使用全局状态。但是每当控制台中出现红色警告时,您都会为 Stack Overflow 哭泣。
使用框架构建产品非常方便。边做边学很酷。但是,由于缺乏深入的了解,您肯定会碰壁。
所以我报名参加了在线课程。
计算机如何理解 JavaScript
问题:您可以用 JavaScript 编写代码,但计算机无法理解。
让我们简化解决方案:
高级代码 -> 数据结构(树或图)
数据结构 -> 低级语言(机器码)
请不要将它与翻译混淆,翻译是一种从高级编程语言到另一种语言的语法转换,例如 TypeScript -> JS。
执行上下文是什么?
在了解 JavaScript 的操作之前,我们首先需要了解什么是执行上下文。
执行上下文是执行一段代码的环境。输入这个,你可以看到上下文信息。上下文的内容取决于你是否在函数内部,但它通常包含:
JavaScript 是如何工作的?
执行上下文分两个阶段执行:
创建阶段:为变量和函数建立内存空间。
代码执行阶段:逐行运行代码(详见下文)。
在创建阶段js中运算符的优先级,所有变量初始设置为undefined,函数完全在内存中。但请注意,“undefined”与“ReferenceError: my_var is not defined”不同,表示变量尚未分配内存空间。
事件循环和执行堆栈
程序运行时,会创建一个全局执行上下文;然后,每当一个函数被调用时,它的执行上下文被放置在执行堆栈的顶部。
请记住,JavaScript 是单线程的,这意味着它只有一个调用堆栈。此外,JavaScript 是同步的,这意味着每个命令都是按顺序执行的。
每个函数都会创建自己的执行上下文,这个上下文将贯穿创建和执行阶段。当栈顶的函数运行完毕后,它会被弹出。
了解作用域链
让我们来看看下面的一段代码:
函数 b() {console.log(myVar);function a() {var myVar = 2;b();var myVar = 1;a();
正确答案是 1. 为什么不是 undefined?
因为如果在当前执行上下文中没有定义一个变量,它会寻找外部环境(在上面的代码中,它是全局执行上下文)。作用域链是这个外部环境的参考链。
JavaScript 类型:基本没有类型
JavaScript 是一种动态类型,这意味着没有关键字来定义变量指向的数据类型。JavaScript 和 TypeScript 的主要区别在于这一点。TypeScript 是一种静态类型。
有哪些基本类型?
原始类型是表示单个值的数据类型(不是键值对或对象)。
JavaScript 中有六种基本类型:
运营商有哪些?
运算符在语法上是不同的函数。通常运算符接受两个参数并返回一个结果。
与普通函数不同,操作符使用中缀表示法,即 3+4,而不是前缀表示法 +(3,4) 或后缀表示法 (3, 4)+.
什么是强制转换?
强制是指将值从一种类型转换为另一种类型,例如:
var a = 1 + ‘2’;
有时强制的行为可能非常奇怪:
控制台.日志(3
相等 (==) 将执行强制转换,而严格相等 (===) 不会:
console.log(Number(‘3’ == 3)); // truthyconsole.log(Number(‘3’ === 3)); // 假
换句话说,我们应该尽可能地使用严格相等,否则代码会表现出一些意想不到的行为。
最后,我们可以使用强制转换来检查是否定义了变量(但要注意零!)
if (a || a === 0) {console.log(“那里有一个。”);
JSON 和对象字面量
JSON 键需要使用引号,但对象不需要。因此,所有 JSON 都可以用作对象,但反之则不然。
但是由于两者非常相似,JavaScript 为 JSON 提供了许多内置功能:
对象字面量和构造函数
本质上js中运算符的优先级,{} 与 new Object() 相同,但使用文字创建的对象是全局的。构造函数允许我们创建对象的实例。
函数就是对象!
JavaScript 中的函数具有关键地位,这意味着函数可以被视为任何其他对象或类型(可以创建、传递等)。这就是 JavaScript 非常适合函数式编程的原因。
虽然,函数和对象的区别主要在以下两个方面指出:
当一个函数附加到一个对象上时,函数作用域中的this指向该对象,而匿名函数中的this指向它的创建者。
按值传递和按引用传递
最后,所有基本类型都是按值传递的,所有对象(包括函数)都是按引用传递的。
基本类型的值变量 a 位于内存中的某处(例如,0x001)。如果我们将一个新的 var b 传递给 var a,它将创建一个基本类型的值的副本 in内存中的另一个位置(例如,0x002)。这是一个值调用(即将该值复制到内存中的两个单独位置)。这意味着我们以后修改a时不会影响b .
但是,当我们复制对象变量时,新变量将指向内存中的相同位置(也称为引用):
a = 新对象();// 0x001b = a; // 0x001
总结
可怜的 JavaScript,他们都说你很奇怪。
这是不公平的,你不应该害怕。
有人理解你的古怪,他们会为你鼓掌。
其实你效率很高,没有太多缺点。
原文链接:
请登录后发表评论
注册
社交帐号登录