1.js的基本知识和变量声明
JavaScript的官方名称是ECMAScript,是一种属于网络的脚本语言,广泛用于web前端,为网页带来各种动态功能
js的诞生在1995年
2009年 es5诞生 可以用于当时多有的浏览器
2015年 es6
2016年 es7
....
2.脚本的定义:
1.和style的样式一样,我们可以引入JavaScript脚本,语法为:
<script src="脚本路径"></script>
2.脚本也可以添加在html里面的head头部里面,但是会有延迟效果,因为浏览器的解析器会先解析头部的js代码,在解析body里面的html代码
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script>
alert("1");
</script>
</head>
<body>
<h1>1</h1>
</body>
在上面的列子中,浏览器会先解析alert(“1”),才会开始显示body里面的h1的标签
3.避免这种延迟的方法有两种,1.用window.onload()里面写js的代码。2.我们把js代码写到html标签的后面,也可以。
4.我们一般推荐我们把js的代码写到body里面的标签的后面
3.自动分号:
使用分号代标着一段代码的执行完成,当我们没有输入分号时,如果有换行符号会帮我们自动添加上,减少错误。
1.我们一般写完一段代码是最好把分号加上。避免错误的产生。
4.变量的声明:
1.我们在es5中只有两个声明变量var function 但是在es6中新增了let/const/symbol三种方法
2命名规则:
1.js中的变量是弱类性,可以保存所有的数据类型,及变量没有类型,而值有类型。变量名一般以字母,$,_开始,后跟字母和数字,切记不能以数字开头。
2.变量的名字不能是关键字:class public等
let public = "liquan"; //这种命名就是错的
3.也可以声明多个变量:
let n = 12, m=13;
3:弱类性:
1.在js中变量的类型是由值的类型的决定的
4变量的提升:
1.这涉及到js的语法规定:是先定义(声明)后执行:意思就是先 浏览一遍代码,把变量的声明提升到最前,这叫做变量的提升,但是必须是var声明的变量才有,但是它的执行还是在原位置
4.TDZ(暂时性死区)
1.用let/const声明的变量都有暂时性死区(TDZ),指变量在作用域中已经存在,但是必须在let/const声明的变量之后。
2.TDZ让程序保持了先声明后执行的习惯,让程序更加稳定
(1)先声明后执行
(2):建议使用let声明变量,少用var
3.如果使用let/const声明的变量先使用后声明会报错,因为用let/const声明变量 前 存在暂时性死区。
console.log(num); // 会报错 num is not undefined
let num = 12;
4.在函数中有let声名,未声明先使用也会报错
Hd = "liquan";
function run(){
console.log(Hd);
let Hd;
}
run() //这段代码也会报错 Hd is not defined
5.在下面的代码中 b没有声明赋值,所以不能直接引用
function hd(a=b,b=3){}
hd ()//Cannot access 'b' before initialization
6.在下面的代码中b已经赋值,所以a可以使用b变量
function hd(a=b,b=3){}
hd ()//Cannot access 'b' before initialization
5.块状作用域:
let const var 的相同点:
1.let/const 和var 他们都可以在全局作用域中声明全局变量。可以在函数中使用
2.他们在函数中声明的变量只能在该函数及其子函数中使用
3.他们在函数中声明的变量外部无法访问。
var:
1使用var声明的变量存在于最近的函数或者全局的作用域中,没有块级作用域
2.没有块级作用域很容易导致全局作用域污染
function run(){
web = 12
}
console.log(web); // web = 12 这就污染了全局作用域
3.var 也容易污染全局作用域:
var i = 6
for(var i =0;i<=4;i++){
console.log(i);
}
console.log(i); / / i = 4 i=4这也污染了全局变量
4.使用let有块级作用域就不会
var i = 6
for(let i =0;i<=4;i++){
console.log(i);
}
console.log(i); / / i=4 i = 6
-
5.var声明的全局变量也存在于 window对象中,容易造成window全局变量的污染,而let声明的变量就不 会存在与window对象中
var num = 12; console.log(window.num); //12 污染了window对象
let
1.用let声明的变量有块级作用域,声明的变量只在块级作用域中生效,块外部的是无法访问的。
2.块内部的可以访问上层作用域的变量。
let num = "liquan"; function run (){ let r = "li" console.log(num); } run() //liquan
3.在不同的作用域中可以声明相同的名字的变量,不会影响别个作用域中的值;
let num = "liquan"; function run (){ let num = "liu" console.log(num); } run() console.log(num); //liu liquan
const:
1.使用const来声明常量和其他语言差不多,比如可以用来声明后台接口的URI的地址。
常量的名字建议最好大写
声明的常量不允许在重新赋值
声明时必须同时赋值
可以修改引用类型的值
注:因为const声明的变量不允许改变地址
2。下面的代码是错误的,因为const声明的变量不允许重新赋值
const url ="htttpls" url="5454"; console.log(url); //报错;常变量被赋值了 Assignment to constant variable.
3.const声明的对象可以改变它的属性值
const name ={ url:"httotot", num:12 }; name.num = 13; console.log(name.num); //13
重复定义
1.使用var重复定义变量不会报错,只会修改值
var price = 18; var price = 19; console.log(price); //price = 19
2.使用let就不会发现这种情况,因为let声明的变量不允许在同一作用域中重新声明,会报错
let price = 18; let price = 19; console.log(price); //erro:
3.在不同作用域中可以重新声明
4.let声明的变量不存在于window对象中
Object.freeze是对象中的静态方法
1.如果冻结变量后,变量也不可以别修改了,使用严格模式会报错。
"use strict" const name = { url:"hrskdw", num:12 } Object.freeze(name); //冻结这变量 name.num=13; console.log(name.num);//Cannot assign to read only property 'num' of object
传值 传址
1.基本数据类型是指数值,字符串等简单的数据类型,引用类型指对象数据类型。
2.基本数据复制是值的复制,基本数据是相互独立的,所以改变值互不影响
3.对于引用类型来讲,变量保存的是引用对象的指针,变量赋值给另一个变量赋值的变量的指针,所以多个对象的引用的就是同一个对象。
undefined
1.未声明的变量或未赋值的变量都返回undefined,函数没有定义return也会返回undefined,所以建议声明变量时,定义一个初始值,这样好分辨变量的状态。
2.undefined是一种数据类型
null:
null定义一个空对象,即如果变量要用来保存引用类型,可以初始化为null,
2.null是一种数据类型。
严格模式
1.严格模式可以让我们及早的发现错误,使代码更安全,规范,推荐代码一直在严格模式下运行。
基本差异:
1.使用严格模式:变量必须使用关键词声明,未声明的变量不允许赋值。
"use strict";
url = 'houdunren.com'; //url is not defined
2.关键词不允许做变量使用。
3.变量不允许重复定义。
解构差异:
非严格模式可以不使用声明指令,严格模式下必须使用声明。所以建议使用 let 等声明。
//"use strict";
({name,url} = {name:'后盾人',url:'houdunren.com'});
console.log(name, url);