1、javaScript
'use strict';
2、数据类型
比较运算符 !重要!
= //赋值
== //等于(类型不一样,值一样,也会判断为ture)
=== //绝对等于(类型一样,值一样,才会判断为ture)
NaN //not a Number(不为数值类型)
建议不要使用 == 比较
须知:
2.1、字符串
- 正常的字符串我们使用 单引号,或者双引号包裹javaScript不区分单引号和双引号
注意转义字符 \
\' 表示字符串 \n 换行 \t tab \u4e2d \u### Unicode字符 \x41 Ascll字符
多行字符串编写 `` piao(tab键上面,Esc下面)
var msg = `hello world 你好ya 你号`
模板字符串
let name = "jiangbiao"; let age = 3; let msg = `你好呀,${name}`
字符串长度
var student = "student" student.length 7
大小写转换
//注意,这里是方法,不是属性 var student = "student" student.toUpperCase() STUDENT student.toLowerCase() student
indexOf()通过元素获得下标索引
var student = "student" student.indexOf("t") 1
substring() 截取字符串
[) var student = "student" student.substring(1)//从第一个字符串截取到最后一个字符串 student.substring(1,3)//[1,3)包含前面 不包含后面 "tu"
- 字符串的可变性, 不可变!
2.2、数组
Array可以包括任意的数据类型
var arr = [1,2,3,4,5,6,"a","b"]
1.长度
arr.length
8
2.indexOf()通过元素获得下标索引
arr.indexOf(2)
1
字符串的 "1" 和数字的 1 是不同的
3.slice() 截取Array的一部分,返回一个新的数组,类似于string中的substring
4.push(),pop() 尾部
push:压入到尾部
pop:弹出尾部的一个元素
arr.push(12)
9
arr
(9) [1, 2, 3, 4, 5, 6, "a", "b", 12]
arr.pop()
12
5.unshift() ,shift() 头部
unshift:压入到头部
shift:弹出头部的一个元素
6.排序 sort()
(3) ["B","C","A"]
arr.sort()
(3) ["A", "B", "C"]
7.元素反转 reverse()
(3) ["A", "B", "C"]
arr.reverse()
(3) ["C", "B", "A"]
8.concat()拼接
(3) ["C", "B", "A"]
arr.concat([1,2,3])
(6) ["C", "B", "A", 1, 2, 3]
arr
(3) ["C", "B", "A"]
注意:concat()不会修改数组,只会返回一个新的数组
9.连接符 join
arr
(3) ["C", "B", "A"]
arr.join('-')
"C-B-A"
打印拼接数组,使用特定的字符串连接
10.多维数组
arr = [[1,2],[3,4],["5","6"]]
(3) [Array(2), Array(2), Array(2)]
arr[1][1]
4
2.3对象
若干个键值对
var 对象名 = {
属性名: 属性值,
属性名:属性值,
属性名:属性值
}
//定义了一个person对象,它有是个属性!
var person= {
name:"nanmu",
age: 3,
email: "2363819485@qq.com",
score: 0
}
js中对象,{......}表示一个对象,键值对描述属性xxxx:xxxx多个属性之间使用逗号隔开,最后一个属性不加逗号!(因为有些浏览器不兼容,会报错。版本低)
1、对象赋值
person.name = "biaobin"
"biaobin"
person.name
"biaobin"
2、使用一个不存在的对象属性,不会报错!只会打印undefined (java中会报错)
person.haha
undefined
3、动态的删减属性,通过delete删除对象的属性(java不行)
delete person.name
true
person
4、动态的添加,直接给新属性添加值即可
person.haha = "haha"
"haha"
person
5、判断属性值是否在这个对象中!xxx in xxx!
//javaScript中的所有的键都是字符串,值是任意对象!
'age' in person
true
//继承(父类的方法)
'toString' in person
true
6、判断一个属性是否是这个对象自身拥有的属性
hasOwnProperty()
preson.hasOwnProperty('toSting')
false
preson.hasOwnProperty('age')
true
2.4、流程控制
1、if判断
var age = 3;
if(age>3){
alert("haha");
}else if(age<5){
alert("ku");
}else{
alert("kuya~");
}
2、while循环,避免程序死循环
while(age<100){
age = age+1;
console.log(age)
}
do{
age = age+1;
console.log(age)
}while(age<100)
3、for循环
for (let i = 0; i < 100; i++) {
console.log(i)
}
4、forEach数组循环
在js5.1引入
//在javascript函数,在java中是方法
var age = [1212,13,15,2,13,1523,2];
//function 函数
age.forEach(function (value){
console.log(value)
})
5、for...in
javascript
var age = [1212,13,15,2,13,1523,2];
for (var num in age){
console.log(age[num]);
}
java
int[] age = {1212, 13, 15, 2, 13, 1523, 2};
for (int num : age){
System.out.println(age[num]);
}
C#
int[] age = { 1212, 13, 15, 2, 13, 1523, 2 };
foreach (int num in age)
{
Console.WriteLine(num);
}
注意:区别是javascript赋给的是索引(建议不用for-in),java赋给的是值。C#使用的是foreach并无for...in
javascript但用for...of(ES6) 可赋给的是值
var age = [1212,13,15,2,13,1523,2];
for (var num of age){
console.log(num);
}
2.5Map 和 Set
ES6的新特性~
Map:
var map = new Map([["ton",100],["jack",90],["haha",80]]);
var name = map.get('jack'); // 通过key获取value!
map.set('admin',123456); //新增
map.delete('ton'); //删除
console.log(name);
Set:无序不重复集合
var set = new Set([3,1,1,1,1]);
set.add(2); // 新增
set.delete(1); // 删除
set.has(3); //是否包含某个元素
set.clear(); //清除全部数据
set.entries() //复制一个相同的值
3.6、iterator
ES6 新特性 for-of
遍历数组
var arr = [1212,13,15,2,13,1523,2];
for (let x of arr){
console.log(x);
}
遍历map
var map = new Map([["ton",100],["jack",90],["haha",80]]);
for (let x of map){
console.log(x);
}
遍历set
var set = new Set([3,1,5,6]);
for (let x of set){
console.log(x);
}
3、函数
3.1、定义函数
定义方式一:绝对值函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到 return 代表函数结束,返回结果!
如果没有执行 return ,函数执行完也会返回结果,结果就是 Undefined
定义方式二:匿名内部类
var abs = function(x){
if(x>=0){
return x;
}else{
return -x;
}
}
function(x){ ...... }这是一个匿名函数,但是可以把结果赋值给abs,通过abs就可以调用函数!
方法一和方法二等价!
函数调用
abs(10); //10
abs(-10); //10
参数问题:javaScript可以传任意个参数,也可以不传参数~
参数进来是否存在的问题?
假设不存在参数,如何规避?
function abs(x){
//手动抛出异常来判断
if (typeof x != 'number'){
throw 'Not a number'
}
if(x>=0){
return x;
}else{
return -x;
}
}
argumentsarguments
是一个JS免费赠送的关键字;
arguments:代表,传递进来的所有的参数,是一个数组!
function abs(x){
for (var i = 0;i<arguments.length;i++){
console.log(arguments[i]);
}
if(arguments.length>1){ //arguments可以通过判断去取值
arguments[1]
}
if(x>=0){
return x;
}else{
return -x;
}
}
问题:arguments包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数~
rest
以前:
if (arguments.length>2){
for (var i=2;i<arguments.length;i++){
//
}
}
ES6引用的新特性,获取除了已经定义的参数之外的所有参数~ ....
function aaa(a,b,...rest){
console.log("a=>"+a);
console.log("b=>"+b);
console.log(rest)
}
rest参数只能写在最后面,必须用 ... 标识
3.2、变量的作用域
在javascript中,var定义变量实际是有作用域的。
假设在函数中声明,则在函数体外不可以使用~(非要想实现的话,后面可以研究一下 闭包
)
function qq (){
var x = 1;
x = x + 1;
}
x = x +2; //Uncaught ReferenceError: x is not defined(报错未定义)
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
function qq (){
var x = 1;
x = x + 1;
function qq1 (){
var x = "A";
x = x + 1;
}
}
内部函数可以访问外部函数的成员,反之不行
function qq (){
var x = 1;
function qq1 (){
var y = x + 1;
}
var z = y + 1; //Uncaught ReferenceError: x is not defined(报错未定义)
}
假设,内部函数变量与外部函数变量,重名!
function qq (){
var x = 1;
qq1();
function qq1 (){
var x = 'A';
console.log("inner"+x);//innerA
}
console.log("outer"+x);//outer1
}
javaScript中函数查找变量会从自身函数开始~由“内”向”外“查找 ( 就近原则)
假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
提升变量的作用域
function qq (){
var x = "x"+y;
console.log(x);
var y = 'y';
}
这个是javaScript建立之初就存在的特性。所以养成规范:所有的变量定义都要放在函数的头部,不要乱放,便于代码维护;
function qq (){
var x=1,
y=x+1,
z,i,a;//undefined
//之后随意用
}
全局变量
//全局变量
x=1;
function f(){
console.log(x);
}
f();
console.log(x);
全局对象 window
var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量都会自动绑定在window对象下;
默认所有的全局变量都会自动绑定在window
对象下;
alert()函数本身也是一个`window`变量
var x = 'xxx';
alert(window.x);
var old_alert = window.alert;
//old_alert(x);
window.alert = function(){
}
//发现alert();失效了
window.alert(123);
//恢复
window.alert=old_alert;
window.alert(456);
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError
规范
由于我们所有的全局变量都会绑定到我们的window上。
如果不同的js文件,使用了相同的全局变量。那么我们如何能够减少冲突
//唯一全局变量
var bloody = {};
//定义全局变量
bloody.name = 'faker';
bloody.add = function(a,b){
return a + b;
}
那么我们可以把自己的代码全部放入自己定义的唯一空间名称中,降低全局命名冲突的问题~(jQuery就是这样)
局部作用域 let
function aa(){
for (var i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//问题? 出了for循环这个作用域还可以使用i
}
解决方法:在ES6 引入了let
关键词,来解决局部作用域冲突问题!
function aa(){
for (let i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1); //Uncaught ReferenceError: i is not defined
}
建议都使用let
去定义局部作用域的变量;
常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;(建议不要去修改这些值)
var PI = '3.14';
console.log(PI);
PI=213; //如果有人不去遵循这个规范,那么这个值是可以去改变的
console.log(PI);
所以在ES6引入了常量关键词const
const PI = '3.14'; //只读变量
console.log(PI);
PI=213; //Uncaught TypeError: Assignment to constant variable.
console.log(PI);
3.3、方法
javascript
存在函数与方法
函数(function)是可以执行的javascript
代码块,由javascript
程序定义或javascript
实现预定义。函数可以带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且还可以返回值,以表示计算的结果。
方法(method)是通过对象调用的javascript
函数。也就是说,方法也是函数,只是比较特殊的函数。假设有一个函数是fn,一个对象是obj,那么就可以定义一个method
:
区别
- 方法中的数据是隐式传递的,所有传递给函数的数据都是显式传递;
- 方法可以操作类内部的数据(请记住,对象是类的实例化–类定义了一个数据类型,而对象是该数据类型的一个实例化)
^ 以上只是简略的解释,忽略了作用域之类的问题。
总结:
- 方法和对象相关;
- 函数和对象无关。
- Java和C#中只有方法,C中只有函数,而C++里取决于是否在类中。
在类型语言中(如:C#,Java)叫方法,在弱类型语言中(如:javascript,vbscript)叫函数,没有严格区分
定义方法
javaScript的方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
var jiang = {
name:'jiangbiao',
bitrh: 2000,
age : function (){
var now = new Date().getFullYear();
return now-this.bitrh;
}
}
//jiang.name 属性
//jiang.age() 方法,一定要带()
//结果:20
this
指针
var jiang = {
name:'jiangbiao',
bitrh: 2000,
age : getAge
}
function getAge(){
var now = new Date().getFullYear();
return now-this.bitrh;
}
//jiang.age 成功打印 20
//getAge() NaN
总结: this始终指向调用他的人(this是无法指向的,是默认指向调用它的那个对象java)
applyapply
是function
的上级,在js可以控制this指向!
getAge.apply(jiang,[]); //this, 指向了jiang, 参数为空