ECMAScript


ECMAScript

一、js 浏览器历史

1.web 发展史

Mosaic,是互联网历史上第一个获普遍使用和能够显示图片的网页浏览器。于 1993 年问世
1994 年 4 月,马克.安德森和 Silicon Graphics(简称为 SGI,中译为“视算科技”或“硅图”)公司的创始人吉姆·克拉克(Jim Clark)在美国加州设立了“Mosaic Communication Corporation”。
Mosaic 公司成立后,由于伊利诺伊大学拥有 Mosaic 的商标权,且伊利诺伊大学已将技术转让给 Spy Glass 公司,开发团队必须彻底重新撰写浏览器程式码,且浏览器名称更改为 Netscape Navigator,公司名字于 1994 年 11 月改名为“Netscape Communication Corporation”,此后沿用至今,中译为“网景”。
微软的 Internet Explorer 及 Mozilla Firefox 等,其早期版本皆以 Mosaic 为基础而开发。微软随后买下 Spy Glass 公司的技术开发出 Internet Explorer 浏览器,而 Mozilla Firefox 则是网景通讯家开放源代码后所衍生出的版本。

2.js 历史

JavaScript 作为 Netscape Navigator 浏览器的一部分首次出现在 1996 年。它最初的设计目标是改善网页的用户体验。
作者:Brendan Eich
期初 JavaScript 被命名为,LiveScript,后因和 Sun 公司合作,因市场宣传需要改名 JavaScript。后来 Sun 公司被 Oracle 收购,JavaScript 版权归 Oracle 所有。

3.浏览器组成

1.shell 部分 2.内核部分
​ 1.渲染引擎(语法规则和渲染)
​ 2.js 引擎
​ 2001 年发布 ie6,首次实现对 js 引擎的优化。
​ 2008 年 Google 发布最新浏览器 Chrome,它是采用优化后的 javascript 引擎,引擎代号 V8,因能把 js 代码直接 转化为机械码来执行,进而以速度快而闻名。
​ 后 Firefox 也推出了具备强大功能的 js 引擎
​ Firefox3.5 TraceMonkey(对频繁执行的代码做了路径优化)
​ Firefox4.0 JeagerMonkey
​ 3.其他模块

4.js 的逼格

1.解释性语言 — (不需要像编译性语言一样编译成文件)跨平台

优缺点

编译:快——开发游戏引擎,操作系统;不能跨平台,移植性不好

解释性:稍慢;跨平台

2.单线程

异步下载

ECMA 标注 — 为了取得技术优势,微软推出了 JScript,CEnvi 推出 ScriptEase,与 JavaScript 同样可在浏览器上运行。为了统一规格 JavaScript 兼容于 ECMA 标准,因此也称为 ECMAScript。

5.js 执行队列

类似吃饭

js 三大部分
​ ECMAScript、DOM、BOM
如何引入 js?
​ 页面 内嵌 script 标签
外部引入
​ 为符合 web 标准(w3c 标准中的一项)结构、样式、行为相分离,通常会采用外部引入
同时外部引入,页面内嵌
外部好使,内部失效

二、js 基本语法

1.变量

变量声明
声明、赋值分解
单一 var 声明法

命名规则

1.变量名必须以英文字母、_ 、$ 开头 2.变量名可以包括英文字母、_、$、数字 3.不可以用系统的关键字、保留字作为变量名(关键字,保留字)

开发规范:

<script>
    var a = 10,
        b = 20,
        d;
    document.write(a,b,c,d);
</script>

2.值类型

原始值(不可改变的;栈数据)

类型 说明
Number var a = 123.12
String var b = “abc”
Boolean var b = false; var a = ture; 输出结果就是本身
Undefined var b = undefined; 输出结果就是本身:没有定义的
Null var b = null; 空值占位

两个数据类型的区别:

原始值:stack(栈) 先进去的最后出来

var a = 10;
var b = a;
a = 20;
document.write(b);

栈内存与栈内存之间是拷贝

引用值(堆数据)

array, object, function

Date,RegExp

以上栈内存、堆内存底层原理见视频

JS 是动态语言,解释一行,执行一行

三、js 基本语句

语句后面要用分号结束“;”

不加分号

  1. function test(){}
  2. for(){}
  3. if(){}

js 不同文件变量可以互相访问

<script>
    var a = 10;
</script>
<script>
    document.write(a);
</script>

js 语法错误会引发后续代码终止,但不会影响其它 js 代码块

<script>
  var a = 10;
  document.write(c);
  //20
</script>
<script>
  var b = 20;
  document.write(b);
</script>

几种错误

  1. 低级错误(语法解析错误) 一行也不执行

  2. 逻辑错误

    先扫描全局,没有低级错误后,解释一行,执行一行

书写格式要规范,“= + / -”两边都应该有空格

1.js 运算符

运算操作符

“+”

1.数学运算、字符串链接

2.任何数据类型加字符串都等于字符串

var a = "a" + 1;
document .write(a); a1

var a = "a" + 1 + 1;
document .write(a); //自左向右:a11

var a = "a" + ture + 1;
document .write(a); ature1

var a = 0 / 0;
NAN——not a number

var a = 1/ 0;
Infinity

“-”,“*”,“/“,“%”,”=“,“()”

优先级”=“最弱,”()”优先级较高

“++”,“- -”,”+=“,“-=”,“/=“,“*=”,“%=”

a ++;先执行语句,后++

var a = 10;
document.write(a++);
//先document .write (a)后++  因为先打印,所以出来10

var a = 10;
document.write(a++);
document.write(a);
//则10 11

var a = 10;
var b = ++a - 1 + a++;
document.write(b + "" + a);
//11(a变成了11)-1+11        b:21   a:12(a最后的++)

比较运算符

​ “>”,”<”,”==”,“>=”,“<=”,”!=”
​ 比较结果为 boolean 值

逻辑运算符

​ “&&”,“||”,“!“
​ 运算结果为真实的值

2.false

undefined, null, NaN, “”(空串), 0, false

3.条件语句

布尔值

1.什么都能比较大小(字符串比较 ASCII 顺序)

2.只要左右一样,则一样

特例:

var a = NAN == NAN;
document.write(a);
//false

3.逻辑运算符:&& || !

&&:

var a = 1 && 2;
document .write(a);      2

两个表达式:

先看前面表达式转换成布尔值是否为真,(false: undefined, null, NaN, “”, 0, false
),真则看第二个表达式转换成布尔值的结果,如果只有两个表达式,只要看到第二个表达式,就可以返回第二个表达式的值了

var a = 1 && 2; //1为真,故返回2
var a = 0 && 2;//直接把第一个表达式的原本的值返回, 故返回0

多个表达式:

先看第一个表达式,如果真,看第二个,也真,看第三个,一旦假的,就返回假的

&&:如果前面是零,就不看了;真,就下一句。

开发应用(短路语句)

2>1&&document .write("成哥很帅")
var data = …;
data && 执行一个语句,会用到data, 如果data空值,就不能执行下面

&

开发没卵用(有卵用)var num = 1 & 3;即 01 & 11 即 01

||

第一个是不是真,真,就返回真的原始值,假的话,返回第二个

4.写兼容应用

div. onclick = function(e){
// 把e的值取出来	非ie浏览器
	var event = e;
}
div. onclick = function(e){
// 把e的值取出来	ie浏览器
	var event = e;
	window. event;
}
兼容:
div. onclick = function(e){
// 把e的值取出来
	var event = e || window. event;
}

5.if、if else if

demo

var score = parseInt(window .prompt('input'));
if(score > 90 && score <= 100){
    document .write('alibaba');
}
if(score > 80 && score <= 90){
    document .write('tencent');
}

优化

var score = parseInt(window .prompt('input'));
if(score > 90 && score <= 100){
    document .write('alibaba');
}else if(score > 80 && score <= 90){
    document .write('tencent');
}else{
}

等价关系

if(1 > 2){
    document .write('a');
}
与
1 > 2 && document .write('a');

6.for

for(var i = 0; i < 10; i++) {
    document .write('a');
}

优化

var i = 1;
var count = 0;
for(; i; ){
    document.write('a');
    count ++;
    if(count == 10) {
        i = 0;
    }
}

思维拓展

var i = 100;
for(; i --; ){
    document.write(i + " ");
}

7.while, do while

带 7 和 7 的倍数:

var i = 0;
while(i < 100){
    if(i % 7 == 0 || i % 10 ==7){
        document.write(i + " ");
    }
    i++;
}

8.switch case

var n = 3;
switch(n) {
    case 1:
        console.log('a');
    case 2:
        console.log('b');
    case 3:
        console.log('c');
}
var n = 3;
switch(n){
    case "a":
        console.log('a');
    case "b":
        console.log('b');
    case ture:
        console.log('c');
}

DEMO

var data = window.prompt('input');
switch(data){
    case "monday":
        console.log('working');
        break;
    case "tuesday":
        console.log('working');
        break;
    case "wednesday":
        console.log('working');
        break;
    case "thursday":
        console.log('working');
        break;
    case "firday":
        console.log('working');
        break;
    case "saturday":
        console.log('relaxing');
        break;
    case "sunday":
        console.log('relaxing');
        break;
}

优化

var data = window.prompt('input');
switch(data){
    case "monday":
    case "tuesday":
    case "wednesday":
    case "thursday":
    case "firday":
        console.log('working');
        break;
    case "saturday":
        console.log('relaxing');
        break;
    case "sunday":
        console.log('relaxing');
        break;
}

9.break

var i = 0;
while(1){
    i++;
    console.log(i);
    if(i > 100){
        break;
    }
}

10.continue

中止本次循环,进行下一循环

for(var i = 0; i < 100; i++){
    if(i % 7 == 0 || i % 10 == 7){
    }else{
        console.log(i);
    }
}
for(var i = 0; i < 100; i ++){
    if(i % 7 == 0 || i % 10 == 7){
        continue;
    }
    console.log(i);
}

四、初识引用值

1.数组

var arr = [1,2,3,4,"abc",undefined];

array 后来赋值即更改

demo 取出每一位

var arr = [1,2,3,45,5,7,"acv",undefined];
for(var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

2.对象 object

demo

var deng = {
    lastName : "Deng",
    age : 40,
    sex : undefined,
    Wife : "xaioliu",
    father : "dengge",
    son : "dengxiaobao",
    handsome : false
}
console.log(deng.lastName);
deng.lastName = "123";
console.log(deng.lastName);

3.编程形式的区别

1.面向过程

2.面向对象

六、typeof

六种数据类型: number、string、boolean、undefined、object、function

false undefined, null, NaN, “”, 0, false

类型转换

demo

var num = 1 * "1";
console.log(typeof(num) + ":" + num);
//s数字类型的1

var num = "2" * "1";
console.log(typeof(num) + ":" + num);
//数字类型2

具体玩法

typeof:typeof(num)或者 typeof num

var num = 123;
console.log(typeof(num));
// number
var num = "true";//字符串true
console.log(typeof(num));
// string

谁返回 object

引用值:对象、数组、null(历史遗留问题)

七、类型转换

1.显示类型转换

Number(mix)

var num = Number('123');
console.log(typeof(num) + " : " + num);
// number:123
//Null:0
//Underfined: NAN
//“a”: NAN
//False:0
//“123”:123

parseInt(string,radix)

基础用法

“123.9”:123
ture:NAN
Null:NAN
Underfined: NAN
123.9:123
123abc:123

基底

var dmeo = "10";
var num = parseInt(demo, 16);//转成16进制
console.log(typeof(num) + ":" + num);
var demo = "10";
var num = parseInt(demo, 16);
console.log(typeof(num) + ":" + num);

radix∈(2-36)

parseFloat(string)

转换成浮点型(正常数字)参数只能是字符串

100.2:100.2
100.2.2:100.2

100.2abs:100.2

toString(radix)

转换成字符串

var demo = 123;
var num = demo.toString();
console.log(typeof(num) + ":" + num);
//string:123

Radix:进制,demo 里面转换成进制

var demo = 123;
var num = demo.toString();
console.log(typeof(num) + ":" + num);
//string : 123

特殊点:
underfined 和 null 不能用

String(mix)

同 number string 是转换成字符串

underfined: underfined
//123:123
//ture:ture

Boolean()

除了这些,都是 ture : undefined, null, NaN, “”, 0, false

题目:10101010 转换成 16 进制

// parseInt       toString
// 2        10      16
var num = 10101010;
var test = parseInt(num, 2);
console.log(test.toString(16));

2.隐式类型转换

isNaN () ——调用 number

//console.log(isNAN(NAN));   ture

//123 false
//“123” false
//null false
//underfined ture
//“abc” ture

// console.log(isNAN("abc"));
// Number('abc')---->NAN  流程

++/— +/-(一元正负)——调用 number

// var a = "123";
// a++;//字符串计算也是124
// var a = "abc";
// a ++;
// // NAN 但是typeof是number

-

两侧有一侧是字符串,就调用 string 变成字符串

// var a = "a" + 1;
// console.log(a + " : " + typeof(a));

*/% ——调用 number

&& || !

< > <= >=

// var a = "3" > 2;
// console.log(a + " : " + typeof(a));
// // 转换成数字比较
// var a = "3" > "2";
// console.log(a + " : " + typeof(a));
// // 比较ASCII

// var a = 1 == "1";
// console.log(a + " : " + typeof(a));//隐式类型转 相等

// // undefined == null:true,其他都是false
// undefined>0
// false
// undefined<0
// false
// undefined==0
// false
// null同理

// NAN == NAN : false;

== !=

3.不发生类型转换

=== !==

没定义直接使用会报错,除了 console.log(typeof(a))

alert(typeof(a));
alert(typeof(undefined));
alert(typeof(NAN));
alert(typeof(null));
var a = "123abc";
alert(typeof(+a));
alert(typeof(!!a));
alert(typeof(a+""));
alert(1 == "1");
alert(NAN == NAN);
alert(typeof(NAN == undefined));
alert("11"+11);
alert(1==="1");
alert(parentInt("13abx"));
var num = 123123.22324;
alert(num.toFixed(3));
alert(typeof(typeof(a)));

八、函数

函数组成形式

  • 函数名称
  • 参数
    ​ 形参
    ​ 实参
  • 返回值

1.定义

方法 1:函数声明

function test(){}

方法 2:函数表达式

函数定义方式

1.命名函数表达式

var test = function abc(){
    document.write('a');
}

2.匿名函数表达式(常用)——函数表达式

var demo = function () {
  document.write("b");
};

3.现象:

abc 不是函数了,test 才是。等号右边是表达式,表达式忽略 abc 名字

test.name//abc
demo.name//demo
test.name//test

2.函数参数

function text(a,b){
    // 相当于隐式var a,b;
    document.write(a+b);
}
text(1,2);

形式参数—形参

function sum(a,b){
    var c = a + b;
    document.write(c);
}

实际参数—实参

sum(1,2);

形参实参不一定相等数量,谁都谁少都行,传参传什么类型都行,也不一定一样

function sum(a){
    document.write(a);
}
sum(11,2,3)

不管调用没调用,都有

function sum(a,b,c,d){
    document.write(a);
    document.write(d);//undefined
}
function sum(a){
    //arguments--[11,2,3];实参列表
    console.log(arguments);
    console.log(arguments.length);
}

小应用

function sum(a){
    for(var i = 0; i < arguments.length; i++){
        console.log(arguments[i])
    }
}
sum(11,2,3);

求形参

function sum(a,b,c,d){
    console.log(sum.length);//形参长度
}
sum(11,2,3);

映射规则(形参=实参才映射):但是是两个东西

function sum(a,b){
    a = 2;
    console.log(arguments[0]);
}
sum(1,2);
//2    a变,arguments也变

function sum(a,b){
    a = 2;
    arguments[0] = 3;
    console.log(a);
}
sum(1,2);
//3    a 也变

参数不相等,不映射

function sum(a, b) {
  // argument[1]就没值了
  b = 2;
  console.log(arguments[1]);
  // 返回undefined
}
sum(1);

3.return

1.函数终止

function sum(a,b){
    console.log('a');
    return;
    //在这里终止
    console.log('b');
}
sum(1);

2.返回值

function sum() {
  return 123;
  console.log("a"); //本句不好使,因为也终止函数
}
sum(1);
var num = sum();
function myNumber(target){
    return +target;
}
var num = myNumber('123');
console.log(typeof(num) + " " + num);

文章作者: Sunny
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sunny !
  目录