码迷,mamicode.com
首页 > 编程语言 > 详细

你真的学会JavaScript了吗?

时间:2020-07-17 19:31:01      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:没有   定义变量   一起   初始化   执行   基本数据类型   操作   nod   复杂数据类型   

技术图片
请听题,请在评论区或在心中给出以下代码的执行结果:

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";

写好答案了吗?要公布答案了哦


0

1

2

NaN

678tianlangstudio

1NaN

如果你的答案跟上面的任意一个匹配上了,那恭喜你! 可以一起往下面看了,因为这是一份全错的答案。

想起上高中时有次英语老师拿了张考卷对着答案讲了半天,然后对我们说:

这是B卷看成A卷的答案了,我们从头讲。

从此我就再不相信什么答案了,甚至遇到做不出的题我都怀疑是不是题出错了!慢慢的养成了独立思考的习惯,不知是好是坏。感谢老师苦心一片,至今教诲良言时犹在耳:

答案错了,重新开始

类型

JavaScript是动态类型语言,也就是说在代码编写时不需要声明指定其类型,变量类型在代码运行时才确定.

基本类型

没有方法、不可变

包括:

  1. undefined
  2. null
  3. boolean
  4. number
  5. string
  6. (symbol)

复杂类型

  1. 对象(包括数组)
  2. 函数

可以使用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的类型

  1. undefined
  2. null
  3. false
  4. +0, -0, NaN
  5. "" //空字符串

注意:

‘false‘ -> true

会被隐私转换为true的类型

此处省略10000字

太多,因为除了上面的都是^-^

基本数据类型(Primitives) VS 复杂数据类型(Objects)

  1. 基本数据类型都是不可变的. 复杂数据类型可变并且使用索引操作
  2. 基本数据类型值传递,复杂数据类型使用引用传递(做为函数、方法参数时)

原型链

  1. 非基本数据类型都有关联属性和方法,比如:

    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没半点关系.

  1. 每个对象都持有一个原型的引用
  2. 跟对象关系越近的原型上定义的属性或方法优先级越高

作用域(Scope)

作用域就是变量生效的范围

使用var定义的变量有效范围是从定义开始到所在函数结束.

使用const,let 定义的变量有效范围是从定义开始到所在块结束.

定义提升:

? 这个需要先说下程序执行过程:

  1. 执行引擎读取整个程序脚步
  2. 解析判断是否有语法错误,如果有错误报错退出执行
  3. 把函数保存到内存中
  4. 声明使用var定义的变量(注意:只有声明没有初始化赋值)

  5. .......

    这就是为什么,我们可以先调用一个函数后对这个函数进行定义,可以先使用一个使用var定义的变量,后面才使用var定义变量而不会报错。因为再执行时把函数定义的代码和var定义提升了.注意看3,4.

全局对象

可以把全局对象想象成一颗大树,在程序中定义的变量也好函数也好其实都挂在一个全局对象上。

在浏览器运行环境中,全局对象是window

在Node.js运行环境中,全局对象是global

未完待续...感谢观看,欢迎关注

你真的学会JavaScript了吗?

标签:没有   定义变量   一起   初始化   执行   基本数据类型   操作   nod   复杂数据类型   

原文地址:https://blog.51cto.com/14256460/2511366

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!