你真的学会JavaScript了吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的学会JavaScript了吗?相关的知识,希望对你有一定的参考价值。
请听题,请在评论区或在心中给出以下代码的执行结果:
var arr = [];
for(var i = 0; i < 3; i++) {
arr.push(function() {console.log(i)});
}
arr[0]();
arr[1]();
arr[2]();
parseInt("678tianlangstudio");
+"678tianlangstudio";
1 + "678tianlangstudio";
写好答案了吗?要公布答案了哦
01
2
NaN
678tianlangstudio
1NaN
如果你的答案跟上面的任意一个匹配上了,那恭喜你! 可以一起往下面看了,因为这是一份全错的答案。
想起上高中时有次英语老师拿了张考卷对着答案讲了半天,然后对我们说:
这是B卷看成A卷的答案了,我们从头讲。
从此我就再不相信什么答案了,甚至遇到做不出的题我都怀疑是不是题出错了!慢慢的养成了独立思考的习惯,不知是好是坏。感谢老师苦心一片,至今教诲良言时犹在耳:
答案错了,重新开始
类型
javascript是动态类型语言,也就是说在代码编写时不需要声明指定其类型,变量类型在代码运行时才确定.
基本类型
没有方法、不可变
包括:
- undefined
- null
- boolean
- number
- string
- (symbol)
复杂类型
- 对象(包括数组)
- 函数
可以使用typeof
判断数据类型:
typeof "Bill" // 返回 "string"
typeof 3.14 // 返回 "number"
typeof true // 返回 "boolean"
typeof false // 返回 "boolean"
typeof x // 返回 "undefined" (假如 x 没有值)
typeof {name:‘Bill‘, age:62} // 返回 "object"
typeof [1,2,3,4] // 返回 "object"
typeof null // 返回 "object"
typeof function myFunc(){} // 返回 "function"
需要注意:
typeof null
返回object
历史原因兼容原来的版本
typeof arr
返回 object
数组也是对象
typeof function testFun() {}
返回 function
类型转换
数据从一个类型转换到另一个类型
强制类型转换和隐式类型转换
强制就是你得自己编写代码转换数据类型,隐式的就是有执行引擎帮你转换.
const x = 17;
const explicit = String(x); //使用强制类型转换把数字x转换为字符串explicit
const implicit = x + ""; //引擎看到你要把个数字跟字符串相加,就帮你把数字转为字符串了.测试题最后一行类似.
操作符== 和 ===
==
会把两边的数据转换为同一种类型再比较是否相等,也就是忽略数据类型,比如:
1 == ‘1‘;//true
===
先判断数据类型,数据类型不一样就直接false, 不为其类焉问其值, 比如:
1 === `1`; //false
会被隐式转换为false的类型
- undefined
- null
- false
- +0, -0, NaN
- "" //空字符串
注意:
‘false‘
-> true
会被隐私转换为true的类型
此处省略10000字
太多,因为除了上面的都是^-^
基本数据类型(Primitives) VS 复杂数据类型(Objects)
- 基本数据类型都是不可变的. 复杂数据类型可变并且使用索引操作
- 基本数据类型值传递,复杂数据类型使用引用传递(做为函数、方法参数时)
原型链
-
非基本数据类型都有关联属性和方法,比如:
Array.prototype.push()
String.prototype.toUpperCase()
? 注意:
? String
是复杂类型,‘tianlang‘
这个是基本数据类型,有些时候它们行为一样,这是因为有自动转化,专业俗语自动装箱
. 例如:
1778.toString();//会报错,因为基本类型没有方法。这么粗暴直接冒失的调用执行引擎也不好意思先装个箱
const x = 1788;
x.toString(); //"1788" 斯文多了,自动装箱成对应的复杂类型走起。
x.__proto__;//Number...
基本数据类型对应的装箱复杂类型:
String()
Number()
Boolean()
Object()
(Symbol())
Java里也有这个概念,但JavaScript除了名字跟Java没半点关系.
- 每个对象都持有一个原型的引用
- 跟对象关系越近的原型上定义的属性或方法优先级越高
作用域(Scope)
作用域就是变量生效的范围
使用
var
定义的变量有效范围是从定义开始到所在函数结束.使用
const
,let
定义的变量有效范围是从定义开始到所在块结束.
定义提升:
? 这个需要先说下程序执行过程:
- 执行引擎读取整个程序脚步
- 解析判断是否有语法错误,如果有错误报错退出执行
- 把函数保存到内存中
-
声明使用var定义的变量(注意:只有声明没有初始化赋值)
-
.......
这就是为什么,我们可以先调用一个函数后对这个函数进行定义,可以先使用一个使用var定义的变量,后面才使用var定义变量而不会报错。因为再执行时把函数定义的代码和var定义提升了.注意看3,4.
全局对象
可以把全局对象想象成一颗大树,在程序中定义的变量也好函数也好其实都挂在一个全局对象上。
在浏览器运行环境中,全局对象是
window
在Node.js运行环境中,全局对象是
global
未完待续...感谢观看,欢迎关注
以上是关于你真的学会JavaScript了吗?的主要内容,如果未能解决你的问题,请参考以下文章