Javascript
导入
1.
<script>
代码
</script>
2.注意script 必须成对出现
<script src="js/pj.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script>-->
<!-- alert("hello javascript")-->
<!-- </script>-->
<script src="js/pj.js"></script>
<!-- 不用显示定义为type 默认就是JavaScript -->
<script type="text/javascript"></script>
</head>
<body>
</body>
</html>
变量定义
var 变量名=值;
条件控制
与java一样
大小写严格区分
输出
console.log("hello") 浏览器的控制台输出
alert("hello") 弹窗
数据类型
number
javascript 不区分小数和整数 均为number类型 infinity表示无穷大
字符串
与java类似
布尔值
true false
逻辑运算
&& 与 || 或 ! 非
比较运算符
=
== 等于(类型不一样,值一样 会判断为true)
=== 绝对等于 (类型,值 都一样才 true)
坚持不要使用==比较
nan 与所有的数值都不相等 包括自己,用 isNaN()判断
浮点数问题
尽量避免用浮点数进行运算,存在精度问题
解决方案:
null 和 undefined
空 未定义
数组
Java 的数组必须是同类型的对象,js不需要
var arr=[1,2,3,4,5,"hello",null,true];
new Array(1,12,3,4,4,4,"hello");
为保证可读性尽量使用[]
越界 undefined
对象
对象是{},数组是[],属性之间以 , 隔开最后一个变量不需要 ,
对象的属性与值之间以 :
var person={
name:"line",
age:18,
money:null,
tags:["js","java","html","css"]
}
对象取值
严格检查模式
<script>
"use strict";//必须写在JavaScript的第一行
</script>
为什么使用:
严格检查模式可以检查局部变量
预防JavaScript的随意性导致产生的一些问题
<script>
i=2;/*全局变量 容易出错*/
var i=2;/*局部变量*/
//es6 中局部变量推荐用let定义 const常量
</script>
字符串
用单引号或双引号括起来
var t="a";
var t2='a';
1.1多行字符串
var msg=`
hello
world
i
am
coming
`;/* `` tab 上 esc下 */
1.2 模板字符串
let name="line";
let age=18;
let msgs=`hello ,${name} in ${age} `;
1.3 字符串长度 str.length
1.4 字符串可变性 不可变
数组
Array 可以包含任意的数据类型
var arr=[1,2,3,4,5];
- 长度
arr.length
给length赋值可以改变数组长度,变小会丢失数据
- indexOf ,通过元素获取下标
arr.indexOf(2)
1
-
slice() 截取array 的一部分,返回一个新数组,类似于String中的substring
-
push(),pop()
push():压入数据到尾部
pop():取出尾部的一个数据
-
unshift ,shift() 头部
unshift():压入数据到头部
shift();从头部弹出一个数据
- 排序
arr.sort();
- 元素反转
arr.revers()
- 数组拼接
arr.concat()
concat 不会修改原数组,返回的是一个新的数组
- 连接符 join
arr.join("str")
打印拼接数组,用特定字符串连接
- 多维数组
arr=[[1,1],[2,2],[3,3]]
(3) [Array(2), Array(2), Array(2)]
arr[1]
(2) [2, 2]
arr[1][1]
2
对象
若干个键值对,最后一个不用,
所有的键都是字符串,值是任意对象
var 对象名{
属性名 : 属性值 ,
属性名 : 属性值 ,
属性名 : 属性值
}
- 使用一个不存在的属性,不会报错 undefined
- 动态的删减属性
delete person.name
true
person.haha="haha"
"haha"
- 判断属性值是否在这个对象中 xx in xxx
'age' in person
true
- 判断一个属性是否为对象自身拥有的 hasOwnProperty()
person.hasOwnProperty("属性名")
流程控制
-
if判断
-
while
-
for
-
forEach
/*需要定义一个function*/
arr.forEach(function(value){
console.log(value)
})
- forin
/*传的是数组下标*/
for (const tKey in arr) {
console.log(arr[tKey]);
}
- for of
for(var x of arr){
console.log(x);
}//打印数组
Map && set
const map = new Map([["tom", 100], ["jack", 10], ["od", 20]]);//for let x of map遍历
const sets = new Set([3,4,5,6,6,6,6,]);//去重 用for of遍历
函数
定义方式一
//绝对值函数
function abs(x){
if(x>=0)
return x;
else return -x;
}
执行return代表函数结束,返回结果
如果没有执行return ,函数执行完也会返回结果undefined
定义方法二
var ab=function(x){
}
可以传任意数量参数,参数是否存在是一个问题
可以通过手动抛出异常来判断
arguments
代表传递进来的所有参数,是一个数组
reset Es6新特性
获取除了已经定义的参数的所有参数
变量作用域
函数查找变量由内向外查找
从自身到外层函数一层层查找
js执行引擎会自动将变量声明提升,但不会提升变量赋值
因此养成规范将变量声明放在函数头部
全局函数
//全局变量
x=1;
function f(){
}
f();
全局对象 window(所有的全局变量都绑定了window)
var x='xxx';
alert(x);
alert(window.x);
var old=window,alert();
//失效
window.alert=function(){}
//恢复
window.alert=old;
js只有一个全局作用域,变量如果在全局作用域都没找到,报错ReferenceError
规范
var person={};//唯一全局变量空间
person.name='ks';
person.add=function(a,b){
return a+b;
}
把代码放入自己定义的全局唯一变量
let
function a(){
for(var i=0;i<100;i++)
console.log(i)
console.log(i+1);//问题:出现101
}
Es6 let 解决局部作用域冲突
function a(){
for(var i=0;i<100;i++)
console.log(i)
console.log(i+1);//问题:出现101
}
常量const
ES6 之前定义常量:自己规定全部大写字母命名的变量就是常量,建议不要去修改
ES6之后引入了const
方法
function a(){
var now=new Date().getFullYear();
return now-this.birth;
}
var k={
name:"kk",
birth:2020,
age : a
}
调用
k.age()
apply
a.apply(k,[])//(对象,参数列表)
apply 将this指向对象k
Date()
var now =new Date();
undefined
now.getFullYear//年
ƒ getFullYear() { [native code] }
now.getFullYear();//年
2020
now.getMonth()//月0~11
9
now.getDate()//日
19
now.getDay()//星期
1
now.getHours()//时
16
now.getMinutes()//分
41
now.getSeconds()//秒
45
now.getTime()//时间戳
1603096905223
now.toString('1603096905223')
"Mon Oct 19 2020 16:41:45 GMT+0800 (中国标准时间)"
JSON
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
var json={
name: 'kk',
age:19 ,
a:function aa(){
alert('hello')
}
};
var jsonstr=JSON.stringify(json)
var obj= JSON.parse(jsonstr);
//////////////////////////////////////////
console.log(json)
{name: "kk", age: 19, a: ƒ}
undefined
console.log(jsonstr)
{"name":"kk","age":19}
undefined
console.log(obj)
{name: "kk", age: 19}
json 可以转换数组,对象,基本数据类型,但不转换方法
原型
var json={
name: 'kk',
age:19 ,
a:function aa(){
alert('hello')
}
};
var jsonstr=JSON.stringify(json)
var obj= JSON.parse(jsonstr);
var stu={
name:'stu',
age:18
}
stu.__proto__=json;
//原型可以随意修改,类似于Java的继承
原型链
由己身向上追溯最终追溯到Object,Object的 _ _proto__是null 表示停止查找 但仍指向自己
继承
class student{
name;
//构造函数
constructor(name) {
this.name=name;
}
h(){
alert('hello')
}
}
class newstu extends student{
constructor(name,age) {
super();//需要调用父类的构造函数
this.name=name;
this.age=age;
}
ms(){
alert(this.name+'has'+this.age);
}
}
本质还是原型