JavaScript

 

1、什么是JavaScript

JavaScript简称JS,是一种具有函数优先的轻量级、解释型或即时编译型的编程语言。

是一门世界上最流行的脚本语言。

ECMAScript它可以理解为是JavaScript的一个标准

最新版本已经到ES6,但是大部分浏览器还只停留在支持ES5代码上。存在开发环境—-线上环境,版本不一致的问题

2、快速入门

2.1 引入JavaScript

内部标签

<script>
    alert("hello")
</script>

外部引入

<script src="js/js.js"></script>

测试

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--第一种方式,内部引用 -->
<script>
    /**
     * script标签内写JavaScript代码,script标签必须成对出现。
     */
    alert("hello")
</script>
<!--第二种方式,外部引用-->
<script src="js/js.js"></script>
</body>
</html>

2.2 浏览器控制台调试

2.3 数据类型

2.3.1

  • 因为JS是弱语言,里面不用声明类型。

  • 统一用 var 来声明变量,变量名不要以数字开头

  • 在ES6新增加了let 和const来声明变量。

  • let是块作用域 const是常量

<!--JavaScript严格区分大小写!-->
    <script>
        // 1. 定义变量    变量类型  变量名  = 变量值;
        // 注:在JavaScript中不存在变量类型,一切的变量都叫var,对于var并没有一个固定的变量类型的限制
        var score = 71;// 此时score就是一个数字类型的变量
        var name='qqqdweob';// 此时name就是一个字符串类型的变量
        // alert(score);
        // 2. 条件控制
        if (score>60 && score<70){
            alert("60~70")
        }else if(score>70 && score<80){
            alert("70~80")
        }else{
            alert("other")
        }
    </script>

2.3.2 Number

JavaScript不区分浮点数和整数,统一用Number表示,以下都是合法的Number类型:

js不区分小数和整数

//--- number
var a  = 1;
a = 123//整数
a = 123.1//浮点数
a = -99//负数
a = NaN//not a number,当无法计算结果时用NaN表示
a = 1.2345e3//科学计数法表示1.2345X1000,等同于1234.5
InFinity//InFinity表示无限大,当数值超过了JavaScript的Number能表示的最大值时表示为InFinity

2.3.3 字符转

//--- 字符串
var b = "abc";
b = 'cba';

2.3.4布尔值

一个布尔值只有true、false两种值,要么是true,要么是false,可以直接用true、false表示布尔值,也可以通过布尔运算计算出来:

//--- 布尔值
var c = true;
c = false;
true; // 这是一个true值 
false; // 这是一个false值 
2 > 1; // 这是一个true值 
2 >= 3; // 这是一个false值

2.3.5 运算符

逻辑运算符

//--- 逻辑运算符
&&  //两个都为真,结果为真
||    //一个为真,结果为真
!    //真即假,假即真

比较运算符!!!

//--- 比较运算符
=      //赋值运算法
==     //等于(类型不一致,值一样,也会判断为true  即判断1=='1')
===    //绝对等于(类型一样,值一样,结果为true)
  • 当我们对Number做比较时,可以通过比较运算符得到一个布尔值:

  • 2 > 5; // false 
    5 >= 2; // true 
    7 == 7; // true

    实际上,JavaScript允许对任意数据类型做比较:

  • false == 0; // true 
    false === 0; // false
  • 由于JavaScript的设计缺陷,不要使用==比较,始终坚持使用===比较

  • NaN,not a number,当无法计算结果时用NaN表示,与所有的数值都不相等,包括自己

  • NaN === NaN; //false
  • 只能通过isNaN()来判断这个数是不是NaN

2.3.6 浮点数问题

(1/3)===(1-2/3) //结果为false

尽量避免使用浮点数进行运算,存在精度问题 

Math.abs(1/3-(1-2/3))<0.00000001 //结果为true

2.3.7 null 和 undefined

  • null 空;

    它和 0 以及空字符串 “ “ 不同, 0 是一个数值, “ “表示长度为0的字符串,而 null 表示“空”。

  • undefined 未定义

  • 大多数情况下,我们都应该用 null 。 undefined 仅仅在判断函数参数是否传递的情况下有用。

2.3.8 数组

  • Java的数组必须是相同类型的对象。JS中不需要这样!

  • 数组是一组按顺序排列的集合,集合的每个值都称为元素。

  • JS的数组可以包括任意数据类型。例如:

var arr = [1, 2, 3.14, 'Hello', null, true]; arr[0]; // 返回索引为0的元素,即1 
arr[5]; // 返回索引为5的元素,即true 
arr[6]; // 索引超出了范围,返回undefined
  • 在浏览器的控制台打印,取数组下标:如果越界了,就会undefined——未定义

2.3.9 对象

  • 对象是大括号,数组是中括号

  • 每一个属性之间使用逗号隔开,最后一个不需要加逗号

  • JavaScript的对象是一组由键-值对组成的无序集合,例如:

var person = { 
    name: 'Bob', 
    age: 20, 
    tags: ['js', 'web', 'mobile'],
    city: 'Beijing', 
    hasCar: true, 
    zipcode: null 
};
  • JS对象的键都是字符串类型,值可以是任意数据类型。上述 person 对象一共定义了6个键值对,其中每个键又称为对象的属性,例如, person 的 name 属性为 ‘Bob’ , zipcode 属性为 null 。

  • 取对象的值,我们用 对象变量.属性名 的方式:

person.name; // 'Bob' 
person.zipcode; // null

2.3.10 变量

  • 变量在JS中就是用一个变量名表示

  • 变量名是大小写英文、数字、 $ 和 _ 的组合,且不能用数字开头

  • 变量名也不能是JS的关键字,如 if 、 while 等

  • 申明一个变量用 var 语句,比如:

var a; // 申明了变量a,此时a的值为undefined-未定义
var $b = 1; // 申明了变量$b,同时给$b赋值,此时$b的值为1 
var s_007 = '007'; // s_007是一个字符串
var Answer = true; // Answer是一个布尔值true 
var t = null; // t的值是null
  • 变量名也可以用中文,但是,请不要给自己找麻烦。

  • 变量的赋值:

    在JS中,使用等号 = 对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用 var 申明一次,例如:

int a = 123; // a是整数类型变量,类型用int申明 
a = "ABC"; // 错误:不能把字符串赋给整型变量
  • 和静态语言相比,动态语言更灵活,就是这个原因。

  • 请不要把赋值语句的等号等同于数学的等号。

2.4 严格检查模式

  • JS在设计之初,为了方便初学者学习,并不强制要求使用var声明变量,这个设计错误带来的后果是:如果一个变量没有通过var声明就被使用,那么该变量就自动被声明为全局变量。
  • i=10;//现在是全局变量
  • 在同一个页面的不同的JS文件中,如果都不用 var 声明,而恰好都使用了变量 i ,将造成变量 i 互相影响,产生难以调试的错误结果。
  • 使用 var 声明的变量则不是全局变量,它的范围被限制在该变量被声明的函数体内,同名变量在不同的函数体内互不冲突。
  • 为了修补JS这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JS代码,强制通过 var 声明变量,未使用 var 声明变量就使用的,将导致运行错误。
  • 启用strict模式的方法是在JavaScript代码的第一行写上:
  • 'use strict';
  • 这是一个字符串,不支持strict模式的浏览器会把它当作一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JS。

  • 调试自己的浏览器是否能支持strict模式:

'use strict';
//如果浏览器支持strict模式,下面的代码将报ReferenceError错误;
abc='hello world';
console.log(abc);
  • 代码部分:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
前提:Idea,设置支持ES6语法
'use strict';严格检查模式,预防JS随意性导致产生的一些问题
必须写在script标签内的第一行!
局部变量建议都使用let去定义
-->
<script>
    'use strict';
    let a = 1;
</script>
</body>
</html>

3 数据类型

3.1 字符串

正常字符串我们使用单引号、双引号包裹

console.log('a');
console.log("a");

注意转义字符 \

'i\'m\"ok\"!';
console.log('i\'m\"ok\"!')
i'm"ok!
\ '  代表一个字符串
\n 表示换行
 \t 表示制表符
 字符 \ 本身也要转义,所以 \\ 表示的字符就是 \ 
 '\x41'; // 完全等同于 'A';ASCII字符可以以 \x## 形式的十六进制表示
'\u4e2d\u6587'; // 完全等同于 '中文';以用 \u#### 表示一个Unicode字符

  • 多行字符串
  //tab上面 esc键下面,此处为反引号 
var msg=
              `hello 
               world
               你好呀
               你好ya`
console.log(msg)
hello
world
你好呀
你好ya

 模板字符串

 let name ="zhangsan";
       let age =154;
       let msg =`你好呀,${name}`//此处为反引号
console.log(msg)
你好呀,zhangsan

字符串长度

var student="student"
console.log(student.length)
7
console.log(student[0])
s

字符串的可变性——不可变

var student="student"
student[0]=1
1
console.log(student)
student

大小写转换

//注意:这里是方法,不是属性了
var student="student"
student.toUpperCase()
STUDENT
student.toLowerCase()
student

字符串查找

var student="student"
console.log(student.indexOf('t'))
1
console.log(student.indexOf('u'))
2

截取

var student="student"
student.substring(1)//从第一个字符串截取到最后一个字符串
tudent
student.substring(1,3)//下标几到下标几 包头不包尾
tu
student.substring(0)
student

3.2 数组

JavaScript的 Array 可以包含任意数据类型,并通过索引来访问每个元素。

var arr=[1,2,3,4,5,6]
//通过下标取值和赋值
arr[0]
1
arr[0]=1
1

1.长度

var arr=[1,2,3,4,5,6]
arr.length
6

注意;假如给iarr.length赋值,数组大小就会发生变化;

如果赋值过小,元素就会丢失

var arr=[1,2,3,4,5,6]
arr.length
6
arr.length=10
10
console.log(arr)
(10)[1,2,3,4,5,6,empty*4]
arr.length=3
3
console.log(arr)
(3)[1,2,3]

2.获得下标索引——indexOf()

var arr=[1,2,3,"1","3"]
arr.indexOf(3)
2
arr.indexOf("3")
4
//注意:字符串的"1"和数字的1是不一样的

3.数组截取——slice()

截取数组的一部分,返回一个新的数组.类似于string中的substring()

var arr=[1,2,3,4,5,6]
arr.slice(3)  //从第三个开始截取
(3) [4,5,6]
arr.slice(1,5)
(4)[2,3,4,5]

4.元素操作

  • 对尾部元素的操作

    push():插入到尾部;

    pop():删除尾部的一个元素

var arr=[1,2,3,4,5,6]
arr.push("a","b")
8
arr
(8) [1,2,3,4,5,6,"a","b"]
arr.pop()
"b"
arr
(7) [1,2,3,4,5,6,"a"]

对头部元素进行操作

unshift():插入到头部;

shift():删除头部的一个元素;

var arr=[1,2,3,4,5,6]
arr.unshift("a","b")
8
arr
(8) ["a","b",1,2,3,4,5,6]
arr.shift()
"a"
arr
(7) ["b",1,2,3,4,5,6]

5.排序 ——sort()

var arr=["c","b","a"]
arr.sort()
(3) ["a","b","c"]

6.元素反转——reverse()

var arr=["a","b","d"]
arr.reverse()
(3) ["d","b","a"]

7.concat():把当前的数组和另一个数组连接起来,并返回一个新的数组

var arr = ['A', 'B', 'C']; 
arr.concat([1, 2, 3]); 
(6) ['A', 'B', 'C', 1, 2, 3]
//注意:concat()并没有修改当前数组,只是返回了一个新的数组
console.log(arr)
(3) ['A', 'B', 'C']

8.join()——把当前 Array 的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:

var arr = ['A', 'B', 'C', 1, 2, 3]
arr.join('-'); 
'A-B-C-1-2-3'

9.splice()——splice() 方法是修改 Array 的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素,会改变原来的数组

var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle']; 
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); 
// 返回删除的元素 
['Yahoo', 'AOL', 'Excite'] 
arr;
['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle'] 
// 只删除,不添加:
arr.splice(2, 2); 
['Google', 'Facebook'] 
arr; 
['Microsoft', 'Apple', 'Oracle'] 
// 只添加,不删除: 
arr.splice(2, 0, 'Google', 'Facebook'); 
// 返回[],因为没有删除任何元素 
arr; 
['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']

10.多维数组——如果数组的某个元素又是一个Array,则可以形成多维数组

var arr=[[1,2,3],[200,900,877],'-']
//上述Array包含3个元素,其中头两个元素本身也是Array
//通过索引取到500这个值
arr[0][2]
3
arr[1][1]
900
arr[2]
'-'

proto:原型链?

数组:存储数据(如何存和取,方法)

3.3 对象

JavaScript的对象是由若干键值对组成的

var 对象名 = {
    key: 'value', 
    key: 'value', 
    key: 'value'
}
//定义一个对象名为person的对象,有6个属性
var person = { 
    name: '小明',
    birth: 1990, 
    school: 'No.1 Middle School',
    height: 1.70, 
    weight: 65, 
    score: null 
}
  • 在JavaScript中,{………}表示一个对象,键值对描述该对象的具体属性XXX:XXXX,多个属性之间使用逗号隔开,最后一个属性不加逗号!

  • 在JavaScript中所有的键都是字符串,值都是任意对象!

  • 对象操作

//定义
let person = {
    name : "张三",
    tags : ['吃饭','睡觉','打豆豆']
}
//由于JavaScript的对象是动态类型,则可以自由的给一个对象添加或删除属性
//1.对象赋值
person.name = "qingjiang"
"qingjiang"
//取值
person.name
"qingjiang"
//取一个不存在的对象属性,不会报错!会显示::undefined
person.haha
undefined
//2.动态的删减属性
//2.1删除属性
delete person.name
true
//2.2添加属性:直接给新的属性添加值即可
person.sex='男'
//取值
person.sex
'男'
//3.判断属性值是否在这个对象中:XXX in XXX
'age' in person
true
//3.1
'toString' in obj; //true,父类中有
//4.判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
person.hasOwnProperty("tostring")
false
person.hasOwnProperty("sex")
true

3.4 流程控制

// if 判断
var age = 3
if (age >= 18) {
    alert('adult')
} 
else if (age >= 6) { 
    alert('teenager')
} 
else { 
    alert('kid')
}
// while循环
var a = 3
while(a < 10){
    a ++;
    console.log(a);
}
4,5,6,7,8,9,10
//避免while死循环
while(true){
    alert(123)
}
//do..while循环
var n = 0;
do {
    n = n + 1;
} while (n < 100)
    n
 100
// for循环
for(let i = 0; i < 10; i++){
//let 局部变量 出了括号就没用了
    console.log(i);
}
0,1,2,3,4,5,6,7,8,9,10
//forEach循环
var age=[12,22,33,4,100,23,67,88];
//函数
age.forEach(function(value){
    console.log(value)
})
12,22,33,4,100,23,67,88
//for in 可以把一个对象的所有属性依次循环出来
var person = {
    fame:"John",
    lname:"Doe",
    age:25
}; 
var text = "";
var x;
for (x in person) {
    text += person[x] + " ";
}
'John Doe 25 '
// for in 遍历下标
var arr=[3,4,5]
for(var x in arr){
    console.log(x)
}
0,1,2
//for in 遍历得到值
var arr=[3,4,5]
for(var x in arr){
    console.log(arr[x])
}
3,4,5
//通过for of遍历值
var arr=[3,4,5]
for(var x of arr){
    console.log(x)
}
3,4,5

3.5 Map和Set

  • ES6中增加了Map和Set

  • Map是一组键值对结构,具有极快的查找速度

//假设要根据同学的名字查找对应的成绩,如果用Arry实现,需要两个Arry
var names = ['Michael', 'Bob', 'Tracy'];
var scores = [95, 75, 85];
//需要先在names中找到对应的位置,再从scores取出对应的成绩,Arry越长,耗时越长

如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢

var map = new Map([['tom',90],['bob',87],['haha',60]]);
var name = map.get('tom'); 通过key获得value
map.set('admin',123456);
console.log(name);
90

Map的相关操作方法

let map = new Map([['1',"小明"],['2',"小华"],['3',"张三"]]);
map.get('3');
张三
//删除元素
    map.delete('1');
map
Map(2) {'2' => '小华', '3' => '张三'}
存在就修改,不存在就添加
    map.set('6',"kuangstudy");
Map(3) {'2' => '小华', '3' => '张三', '6' => 'kuangstudy'}
//遍历map
for (let x of map){
    console.log(x);
}
(2) ['2', '小华']
(2) ['3', '张三']
(2) ['6', 'kuangstudy']
//是否存在key'Adam'
map.has('Adam')
false

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

var m = new Map(); 
m.set('Adam', 67); 
m.set('Adam', 88); 
m.get('Adam'); 
88
  • Set:与Map类似,也是一组key的集合,但不存储value,在Set中没有重复的key

  • Set是无序不重复的集合

var s1 = new Set(); // 空Set 
var s2 = new Set([1, 2, 3]); // 含1, 2, 3

重复元素在 Set 中自动被过滤:

var s = new Set([1, 2, 3, 3, '3']); 
s; // Set {1, 2, 3, "3"}
//注意:数字3和字符串"30"是不同的元素

Set的相关操作方法

var set = new Set([1, 2, 3]);
//通过 add(key) 方法可以添加元素到 Set 中,可以重复添加,但不会有效果:
set.add(4); 
set; 
Set {1, 2, 3, 4} 
set.add(4); 
set; 
仍然是 Set {1, 2, 3, 4}
//遍历set
for (var x of set){
    console.log(x)
}
1,2,3,4
//通过 delete(key) 方法可以删除元素:
var s = new Set([1, 2, 3]); 
s.delete(3); 
s; 
Set {1, 2}
set.has();是否包含某一个元素

 3.6 Iiterator(ES6新特性)

遍历 Array 可以采用下标循环,遍历Map 和 Set 就无法使用下标。

适用iterator可以来遍历迭代我们的Map,Set

遍历集合

var a = ['A','B','C'];
var s = new Set(['A','B','C']);
var m = new Map([[1,'x'],[2,'y'],[3,'z']]);
for (var x of a){//遍历Arry
    console.log(x)
}
A
B
C
for (var x of s) { // 遍历Set 
    console.log(x); 
}
A
B
C
for (var x of m) { // 遍历Map 
    console.log(x[0] + '=' + x[1]);
}
1=x
2=y
3=z

var arr = [3,4,5];
arr.name = "213"; 这样输出 0 1 2 name 
for(let x in arr){
    conlog.log(x);//下标0 1 2

}
for in 取得索引下标,map set 没有

forEach循环(5.1引入)

更好的方式是直接使用 iterable 内置的 forEach 方法,它接收一个函数,每次迭代就自动回调该函数

//以 Array 为例
a.forEach(function (element, index, array) { // element: 指向当前元素的值 
// index: 指向当前索引 
// array: 指向Array对象本身 
    console.log(element + ', index = ' + index); 
});
  • forEach() 方法是ES5.1标准引入的,需要测试浏览器是否支持。

  • Set 没有索引,因此回调函数的前两个参数都是元素本身:

var s = new Set(['A','B','C']);
s.forEach(function (element,sameElement,set){
    console.log(element)
})
A
B
C

 var age = [12,3,12,3,6567,452,3];

        age.forEach(function (value){
            console.log(value)
        })


for,,in

for (var num in age) {
            //hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性,
            // 如果是,返回true,否者false; 参数propertyName指要检测的属性名;
            if (age.hasOwnProperty(num)){
                console.log("存在");
                console.log(age[num])
            }
        }

 Map 的回调函数参数依次为 value 、 key 和 map 本身:

var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]); 
m.forEach(function (value, key, map) { 
    console.log(value);
});
x
y
z

遍历数组

<script>
        /*通过 for of /for in 下标*/
        var arr = [3,4,5];
        for (var x of arr) {
            console.log(x);
        }
    </script>

遍历map

var map = new Map([["tom",100],["jack",90],["haha",80]]);
        for (let x of map) {
            console.log(x);
        }

遍历set

 var set = new Set([3,4,5]);
        for (let x of set) {
            console.log(x);
        }

for in操作 打印数组下标

  var arr1 = [3,4,5];
        for (let x in arr1) {
            console.log(x);
        }

for in 取得索引下标,map set 没有,let多适用局部变量

for in 遍历的是是对象的key!!!

  var arr1 = [3,4,5];
        arr1.name = "213";
        for (let x in arr1) {
            console.log(x);
        }


函数

1、定义函数

绝对值函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值