javaScipt
javaScript是一门世界上最流行的脚本语言。
1、快速入门
1.1 引入javaSciprt
- 内部标签
- 外部引用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 外部引用
注意<script>必须成对出现,不能自闭合
-->
<script src="js/qj.js"></script>
<!-- <script>-->
<!-- alert("hello world");/* 弹窗*/-->
<!-- </script>-->
</head>
<body>
</body>
</html>
1.2基本语法入门
-
语法和java基本一致,甚至没有java严格,但是和java一样严格区分大小写
-
console.log()在浏览器的控制台打印变量
1.3数据类型
变量都是用var
- ===绝对等于(类型一样,值一样,结果谓true)
- nan===nan,这个与所有的数值都不相等,包括自己。只能通过is(NAN)来判断这个数是不是NAN
浮点数问题:
console.log((1/3===(1-2/3)))
尽量避免使用浮点数进行运算,存在精度问题,可以通过下面这个运算,来得到两个值是不是几乎相等
-
Math.log((1/3===(1-2/3))<0.0000000001
null和undefined
- null 空
- indeflined未定义
数组:
- java的数组必须是同类型的对象,而在js中,var已经包括了所有的类型,所有不用必须同类型对象。
- 如果在显示数组的时候,java中显示数组下标越界的错误时,在js上则现实的是indefined
对象:
- 对象是大括号,数组是中括号
- 每个属性之间适用逗号隔开,最后一个不需要添加
1.4严格检查模式strict
-
如果下面这个strict语法报错,则因为idea没有选到es6版本
-
"use strict"写到最前面一行
-
let局部变量
2、数据类型
2.1字符串
1、正常的字符串我们使用单引号,或者双引号包裹
2、注意转义字符
3、多行字符串编写````
4、模板字符串
let mag = `你好:,${name}`
5、字符串长度
str.length
6、字符串的可变性,不可变
7、大小写转换
//注意这里是方法,不是属性
student.toUpperCase
student.toLowerCase
8、student.indexOf()
9、subbstring():从第一个字符串截取到最后一个,包含前面,不包含后面
2.2数组
Array可以包含任意数据类型
1、长度 .length
注意:加入给Array赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失
2、indexOf通过获得下表索引
字符串的1和数字1是不同的
3、slice()截取数组的Array的一部分,返回一个新的数组,类似于String中的substring
4、push():压入到尾部
pop():弹出尾部的一个元素
5、unshif();头部
shift();
6、排序sort()
7、元素反转reverse
8、concat():返回一个新数组,不改变原来数组
9、连接符join
打印拼接数组使用特定的字符串链接
10、多维数组
2.3对象
- 若干个键值对
var person{
name: "dawdaw",
age:12,
score:11
}
- js中的对象,{...}表示一个对象,键值对描述属性,多个属性之间使用,隔开,最后一个属性不加逗号。
- javascript中的所有的键都是字符键,值是任意对象
1、对象赋值
2、使用一个不存在的对象属性不会报错,会返回undefind
3、动态的删减属性:通过delete删除对象的属性
4、动态的添加,直接给新的属性添加至即可
5、判断属性值是否在这个对象中xxxinxxx
6、判断一个属性是否是这个对象自身拥有的hasOwnPropetty()
2.4、流程控制
if判断
let age= 3;
if(age>3){
alert("haha")
}else if(a<5){
alert("kuwaawdwa")
}else {
alert("kuwa")
}
while循环,避免程序死循环
while (age<100){
age++;
console.log(age)
}
do{
age = age+1;
console.log(age)
}while
for循环
for (let i = 0; i < 100; i++) {
console.log(i);
}
foreach
var age = [1,2,3,4,3,2,3,2,3,4,3];
age.forEach(function (value){
console.log(value)
})
2.5、Map和Set
Map:
let map = new Map([['ton',100],['dwad',20],['fese',90]]);
let name = map.get('ton');//通过key获得value
map.set("a",22)
console.log(map);
map.delest(“tom”)
Set:无需不重复的集合
set.add(2);
set.delete(1);
console.log(set.has(3));//是否包含某个元素
2.6、iterator
遍历数组、Map和Set
'use strict'
var arr=[3,4,5];
for(var x of arr){
console.log(x);
}
var arry = new Map([["DAW",12],["FAF",10],["FAWF",33]]);
for (let i of arry) {
console.log(i);
}
var arr1 = new Set([5,6,7]);
for (let x of arr1){
console.log(x)
}
3、函数
3.1、定义函数
绝对值函数
function abs(x){
if (x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return代表函数结束,返回结果
如果没有执行return,函数执行完也会返回结果,结果就是undefined
方式二
var abs = function (X) {
}
function (X) {...}这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数
参数问题:javascript可以传任意个参数,也可以不传递参数。
arguments是一个js免费赠送的关键字;
代表:传进来的所有参数,是一个数组
function abs(x){
console.log("x>=" + x);
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
// if (arguments.length>1){
// arguments[1]
// }
if (x>=0){
return x;
}else {
return -x;
}
}
rest新特性:获取除了已经定义的参数之外的所有参数
4.2、变量的作用域
- 在javascript中,var定义的变量实际是有作用域的。
假设在函数体重声明,则在函数体外不可以使用。(非要实现的话,后期可以研究一下 闭包)
function qj(){
var x = 1;
x = x + 1;
}
x = x + 2;//ReferenceError: Can't find variable: x
- 如果两个函数使用了相同的变量名,只要在函数内部,就不冲突。
- 内部函数可以访问外部函数的成员。而外部函数不能访问内部函数的成员。
- 假设内部函数变量截外部函数重名,函数值查找变量会从自身函数开始向外查找,选择最近的一个赋值
提升变量的作用域:js的执行引擎,自动提升了y的声明,但是不会提升t的赋值。
- 比如:x = ’x‘ + y
- y = ’y‘ 结果是:xundefined y是存在的,但是没有值
- 这个是在js建立之初就存在的特性,养成规范:所有的变量定义都放在函数的头部,不要乱放,编译代码维护。
全局函数:
var x = 1;
function qj() {
console.log(x);
}
qj();
console.log(x);
全局对象 window
var x = 'xxx';
alert.x;
alert(window.x);//默认所有的全局变量,都会自动绑定在window对象
alert这个函数本身也是一个window变量:window.alert
js实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,会宝座RefrenceRrror
规范:
-
由于我们所有的全局变量都会绑定在window上,如果不同的js文件使用了相同的全局变量,就会冲突
-
//唯一的全局变量 var Xiao = {}; Xiao.name = "等等"; Xiao.add = function (a,b){ return a+b; }
把自己的代码全部放入自己定义的唯一空间名字中,降低全局名冲突问题。
jQuery:等价于$();
局部作用域let:
function aaa(){
for (Var i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//问题:出了这个作用域还可以使用
}
ES6 let关键字。解决局部作用域冲突
function aaa(){
for (let i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//问题:出了这个作用域还可以使用
}
建议使用let
常量const:
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量:建议不要修改这样的值。
var F1 = '3.14'
console.log(F1);
F1 = '11'
console.log(F1);//可以改变
在ES6引用了常量关键字const
const PI = '3.14';//只读变量
console.log(PI);
PI = '233'//这行是错误的
console.log(PI);