一.简介
1.起源
JavaScript 起源于 1995 年,当时它主要是为了满足网页交互的需求而被创建。它最初的设计目的是为了让网页开发者能够在网页中添加一些简单的交互效果和动态内容。在那个时期,网页大多是静态的,而 JavaScript 的出现为网页带来了新的活力。Netscape 公司的 Brendan Eich 负责了 JavaScript 的开发工作。起初,它的名字是 LiveScript ,后来为了借助 Java 语言的热度,更名为 JavaScript 。例如,早期的 JavaScript 可以用于验证表单输入,当用户提交表单时,能够在客户端立即检查输入是否符合要求,而无需将数据发送到服务器进行验证,节省了时间和资源。另外,它还可以用于在网页上显示动态的日期和时间,或者根据用户的操作显示或隐藏某些元素。随着时间的推移,JavaScript 不断发展壮大,功能越来越丰富,应用场景也越来越广泛,从简单的网页交互扩展到了 Web 应用开发、服务器端编程(如 Node.js )、移动应用开发等众多领域。
2.ECMAScript
很多同学可能跟着网上学习,学到最后看到别人公司要求熟悉ES6,一头雾水,ES6是什么?
ES6是ECMAScript 6的简称,是JavaScript的一种规范.
二.语言基础
1.定义变量
①var(声明范围:函数作用域)
利用var操作符定义的变量会成为包含它的函数的局部变量。比如使用var在一个函数内部定义一个变量,就意味着该变量将在函数退出时候被销毁。
var声明提升
所谓“提升(hoist)”,也就是把所有变量声明自动拉到函数作用域的顶部
function test(){
var age=26
var age=36
var age=46
console.log(age)
}
test()//46
经典面试题
for(var i=0;i<10;i++){
setTimeout(()=>{console.log(i)},1000)
}
//该段代码的输出结果是?
原因:setTimeout 回调函数内部访问的 i 这个变量并不是在定义 setTimeout 时就把 i 的当前值固定下来了。由于 var 声明的变量存在变量提升且不存在块级作用域的特点(在 for 循环中使用 var 声明的 i 实际上是在函数级作用域内的一个变量),所有这 10 次循环中定义的 setTimeout 回调函数实际上共享的是同一个 i 变量。
当 1 秒过去后,这些回调函数开始依次执行,此时它们去获取 i 的值,而这时 for 循环早已结束,i 的值已经变成了 10,所以每个回调函数执行 console.log(i) 时输出的都是 10,总共就会输出 10 个 10。
②let(声明范围:块作用域)
提一个点:块作用域时函数作用域的子集
然后再记住一点就可以:let 没有声明提升!在let声明之前的执行瞬间被称为“暂时性死区”,再次阶段引用任何后面才声明的变量都会抛出ReferenceError.
③const(声明范围:块作用域)
const基本与let一致,重要区别是:const声明变量必须同时初始化变量
需要记住的是:const声明的限制只使用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。
数据类型分为基本类型和引用类型
2.数据类型
(1)简单数据类型(原始类型):
Number,String,Boolean,Undefined,Null,Symbol(es6)
①Undefined类型:当使用var或者let声明变量但是没有初始化时,就相当于给变量赋予了undefined值。
②Null类型:表示一个空对象指针。在定义将来要保存对象值的变量时,建议使用null来初始化。undefined值是由null值派生而来的,他们“表面上”相等。
(2)复杂数据类型(引用数据类型)
Object(对象)
Array,Function
严格来讲:函数在es当中被认为是对象,并不代表一种数据类型。
存储区别:原始数据类型存储在栈中,引用类型的对象存储在堆中
(3)确定类型
typeof对于原始值很有用,但他对引用值的用处不大。ECMAScrip提供了instanceof操作符。
万能方法:
Object.prototype.toString.call()
是 JavaScript 中用来判断数据类型的一种常用方法。它的主要作用是返回传入值的内部属性[[Class]]
的字符串表示,通常用来做精确的类型判断。
三.变量,作用域,内存
1.原始值和引用值
ES变量中可以包含两种不同的数据类型:原始值和引用值。
原始值就是最简单的数据,引用值则是由多个值构成的对象。
保存原始值的变量是按值访问的,因此我们操作的就是存储在变量的实际值。
JavaScript不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间,在操作对象