记录整理入门的JavaScript学习一些重要知识点

命名规则:

1、不以数字开头的字母、数字、下划线、$组成;2、不能是关键字和保留字;

3、具有相关意义;

4、驼峰命名法;

5、标识符区分大小写;

一、变量

概念:在内存中开辟一块指定字节的空间,用存储数据,且程序运行数据相应变化

变量声明:显示变量(var),隐式声明(声明时必须赋值,否则报错)

var something = 'hi';

something2 = 'hello' (省略var操作符,是有效的,但是不推荐)

注意:虽然省略var操作符可以定义全局变量,但是不推荐,因为在局部作用域中定义的全局变量是很难维护,而且在未经声明的变量赋值在严格模式下会导致ReferenceError的错误。

二、数据类型

JavaScript数据类型:

基本类型:Number \ String \ Boolean

特殊类型: Null \ Undefined

组合类型 : Array \ Object \ function

typeof 操作符  -- 查看变量的数据类型

typeof 操作符的操作数可以是(num)变量,也可以是数值字面量,但是要注意typeof 是一个操作符,而不是一个函数。

1、Undefined 类型只有一个值,特殊的undefined,在使用var声明变量但未对其他加以初始化的时候,这个变量的值就是undefined

var meesage;
console.log(message == undefined); //true

console.log(message) // "undefined"
console.log(age) // 未定义报错"age is not defined"

console.log(typeof message); // undefined
console.log(typeof age); //undefined --typeof操作符检测未声明的变量调用delete不会导致错误
2、 Null 也是只有一个值的数据类型,这是特殊的值是null 。使用typeof操作符检测null值的时候返回“object”

var car = "null";
console.log(typeof car); // "object"
就是说明定义的变量准备在将来用于保存对象,那么最好就将该变量初始化为null而不是其他值;
换句话说,只要意在保存对象的变量还没有真正保存对象,就该明确地上该变量保存为null值;
实际上,undefined值就是派生自null的值,故null==undefined //true; 
--常用判断null
console.log(null==0); //false
console.log(null==""); //false
console.log(null==false); //false
console.log(null==null); //true
console.log(null==undefined); //true 
3、 Boolean 只有两个字面至 true/false.
要将一个值转其对应的Boolean 值,可以调用转型函数Boolean()
var message = "hello world";
var m1 = Boolean(message);

console.log(message) // "heollo world";
console.log(m1) //true
数据类型
转为true值
转为false的值
Boolean
true
false
String
任何非空的字符串
“”
Number
任何非零数字值(包括无穷大)
infinty(正无穷)
-infinty(负无穷)
0、NAN
Object
任何对象
null
Undefined
n/a(或N/A)是not applicable的缩写,意思是不适用
undefined

4、Number 数字(正负数、小数(浮点数)、infinty(正无穷)、-infinty(负无穷))

浮点数值的最高精度是17位小数,但在计算时会产生舍入误差问题

5、NAN(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况


三、运算符

1、运算符:有变量、常量和操作符组成
2、算术运算符:++(递增、自增)、--(递减、自减)、*(乘)、/(除)、%(模)、+(加)、-(减)

3、优先级从高到低
3-1 乘法*

     算数运算法则:一切正常数字都正常计算,其他类型先转为数字再进行计算,不能转化为数字类型的则为NAN

    Boolean 运算,true会转为1,false为0;

   null 运算时,转换为0

3-2 除法 ((字符串非数字的情况)不可转换为数字类型的都为NAN,除数可为0)

console.log(3/false) //Infinty
console.log(-3/false) //-Infinty
console.log(0/0) //NAN
console.log(3/null) //Infinty

3-3 取余(模运算%)求余运算时尽量都是整数,因为小数会不精确

3-4 加法(连接符)这个比较特殊,是需要注意的。加号两边有一个字符串,加号的作用就是连接符的作用,产生一个新的字符串。只要有一个字符串,另一个也会被换成字符串,变成新字符串

console.log(3+3+"3") //63
console.log("3"+3+3) //333
console.log(3+undefined) //NAN
3-5 减法

console.log(3-)undefined //NAN

3-6 递增++。每运行一次++,对应量的变量+1,结合变量使用

3-7 递减--

num++ ;后缀自增,先将变量+1,再使用

++num;前缀自增,先使用变量,再加+1

减法也是一样的道理:--num,num--

4、 关系运算符

>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)、===(恒等于)、!==(不全等/不恒等)

运算符有number类型,都转为number类型比较

左右没有number类型,都是字符串时,先比较第一个字符如果相同,再比较下一个字符,直到结束

alert("100">"100"); //false
alert("1000">"100"); //true 0比空大

5、赋值运算符

简单赋值:=

复合算术赋值:+=、-=、*=、/=、%=

6、特殊运算符 typeof

7、类型的转换

isNAN();判断小括号内的参数是不是NAN

parseInt();只转有效数字开头的字符串,为整数,否则为NAN

parseFloat();只转有效数字开头的字符串包括小数,否则为NAN

Number();只能转换有效数字字符串,只有非数字的NAN

eval();将字符串强制换为表达式并返回计算后的结果

8、逻辑运算符(以下按优先级总结)

!(非)逻辑关系:非真即假,非假即真

alert(!0); //true
alert(!1); //false
//一切非零的数据都为true
alert(!2>1) //fasle
&&(与)两边都为真即为真,一边有假即为假

||(或)两边都为假即为假,一边有真即为真

&&、|| 短路现象,直接用代码来展示出来吧

var a = 5;
//b是没有定义的
alert(a>14 && b<3) // 不会报错,false,第一个值就为false
alert(a>3 || b<3);//true,第一个值是true就直接返回了true的结果
console.log(1&&2||3) //2
console.log(0&&1||2) //2

9、三目运算符?:

用法 :(条件)?语句A:语句B

//判断是否为闰年
var year = 2014;
year%4==(0 && year%100 || year%400==0)?alert(year+"闰年"):alert(year+"平年")


四、流程控制语句

在JS中,程序的三大结构:

  1. 顺序结构:按照程序书写的顺序,一句句执行,不跳过任何一个语句
  2. 选择结构:按条件是否成立,选择执行不同的语句
  3. 循环结构:根据条件是否成立,重复执行一个相同的语句块

选择语句:if语句(三种使用模式);

if(条件){

语句A

}
if(条件){

语句A

}else{

语句B

}

if(条件1){

语句A;

}else if(条件2){

语句B;

}

在这里首先要介绍的,就是循环语句:

循环语句三要素:1)循环起点;2)循环的结束条件;3)步长/步进,使循环计数增加或者减少,趋近于结束条件

一、while循环

表达式1(从哪里开始);

while(表达式2(到哪里结束)){

语句组;(要循环的语句)
表达式3(步进);

}

var count = 1;
while(count<11){
	document.write("hello world");
	count++;
}

二、do while 直到型循环(先斩后奏,先执行一次)

表达式1(从哪开始);

do{

语句组;

表达式3(步长);

}while(表达式2结束条件)

while循环和do while的区别:一是如果循环条件第一次为真时,无区别。二是,如果循环条件第一次为假时,do while循环至少要执行一次循环体,而while循环一次都没有


三、for循环(最重要的一个循环结构)

for(表达式1;表达式2;表达式3){

语句组;

}

//九九乘法表
for(var i = 1; i <= 9; i++) {
	for(var j = 1; j <= i; j++) {
		document.write(j + "*" + i + "=" + j * i + " ");
	}
	document.write("<br/>")
}

for(变量 in 集合){}集合:数组名或者对象名,可以用来遍历数组的数组元素,和对象的属性集合

四、switch语句,先匹配,再往下执行,确定值

switch(表达式){

case 常量表达式1:语句组1;[break;] //[]这里我就备注一下,这个中括号就是表示这个代码在此处是可加可不加的,下面会介绍break的使用

...

case 常量表达式n:语句组n;[break;]

[default:语句组n+1;] //相当于else

}

注:switch后的表达式只能是整数和字符;

case后的表达式不允许出项变量;

case后的常量值不能重复;

case和default的顺序可以随意;

break;跳出switch结构,如果没有break则会继续执行下面的分支;

在这里我就先普及一下break和continue;

break;使用在switch中是跳出switch语句的执行;在循环中,终止一层循环,以下的就不再执行,终止了for;

continue;用在循环语句中,终止一次循环,提前进入下一次循环,在后面加alert也不再执行,直接回到循环;


五、函数(方法)

1、概念:对于需要反复使用的功能代码,将其封装成一个独立的模块,这种功能代码块叫函数;(重复使用一段代码;方便代码管理;便于控制程序的执行时间)


2、语法

(1)语句定义法

function 函数名(){
    函数体
}
(2)表达式定义法
var 函数名 = function(){
    函数体,就是函数要干的事情
}
调用函数:函数名()
这两种定义的方法,是一定的区别的,首先是调用问题,在这里,我就先简单介绍一下,代码预编译的概念

调用顺序问题:预编译(可先调用函数,后定义函数)

(1)语句定义法可在任何地方调用(预编译)

(2)表达式定义的调用,只能是先定义后调用

JS预编译时:变量提前声明(赋值未读)只知道有这个变量,不知道是什么‘东西’。

函数的返回值 return(有return会跳出函数);

JS函数有两种,一是内置函数如:alert();console.log();parseInt();……二是,自定义函数

这里还有一个作用域的概念,是比较重要的

作用域:就是起作用的范围或这说是有效范围

局部变量:定义在函数内部的变量,只能在函数内部使用,作用域:只是函数内部,形参就是局部变量;

全局变量:定义在函数外部的变量,在任何函数中都有效,作用域:整个文件的任何地方;
注意:定义变量是不可以省略var,但是省略是合法的。不写var时会被解释是全局变量(不管在那写,这是隐式声明);

为什么局部变量不能在外部调用?

函数调用时,局部变量,会开辟一个空间,调用之后,局部变量消失,当下一次调用时,局部变量会再次被赋值,开辟的空间用完之后又消失;

形参也是局部变量


在函数中有一个特殊使用方法,就是递归

递归:就是函数调用函数自身,成为递归调用;

但是你要分清楚不是所有的函数调用自身都是称为递归的。就犹如一下的例子;

function m1(){
	alert('111');
	m1();
}
m1();
这样的自身调用自身,反复出项111,这是一个死循环,会造成浏览器崩溃。

递归,就是先传递再回归

方法:

1、首先找到临界,即无需计算获得的值

2、找这一次和上一次的关系(一般从后往前找)

3、就爱摄当前函数已经可以使用,调用自身计算上一次运行结构,再写出这一次的运行结果(函数表达式,临界值);

以下就举个例子看递归用在哪,怎么用;

//阶乘100! 从大到小
function jiecheng(n){
	if(n==1){
		return 1;
	}
	return n*jiecheng(n-1);
}
console.log(jiecheng(100))

数组Array

数组:是一个可以储存一组或者一系列相关数,对象的容器;

数组元素:是指存储在数组中并赋予了唯一的索引;

数组的定义

1、创建对象的方式来创建new关键字

var arr = new Array(); //括号不写参数表示创建一个空数组
alert(arr.leght); //0 
1)var arr = new Array(4); //括号内有且只有一个参数,如果传入一个正整数,则为定义了一个长度为4的数组,并没有赋值;

arr[0] 这样是提取出来arr数组的第一个元素,方括号内填的是该数组元素的索引,当打印console.log(arr[0])的时候,因为没有被赋值,所有打印出来是为undefined;

2)var arr = new Array('4');加了双引号就是说,传入了一个字符串string类型的,这就表示了,定义了一个只有一个数组元素为‘4’,数组长度为0的数组;

3)var arr = new Array(4,5,6,7); 括号内可以传任何类型,但是在一般的开发中,只存一种类型的数组元素

2、隐式声明的方式

var arr = [1,2,3,4,5];

var arr = []; 空数组,无论括号内写的是什么数据,都是表示数组元素,

var arr = [2]; 长度为1,元素为2

3、赋值方式-一是直接赋值,二是先声明后赋值

var arr = [];

arr[0] = 1;

arr[7] = 2;

上面显示定义了一个空的数组,然后又直接定义了第一个元素的值,和第八个元素的值,要注意,数组的索引值是从0开始算起的。所以这样定义下来后,这个数组console.log(arr.length) // 8这个数组的长度为8;其他没有被赋值的数组元素的值都为undefined。

如:console.log(arr[3]); 上面第四个元素没有被定义,所以打印出来是undefined;

还有一点就是,对象的属性,既可以获取,也可以设置,这时候,arr.length = 1;之后,再打印console.log(arr[7]); 这时候打印出来的也为undefined,设置了数组长度为1,就是其他数组元素都不要了。

4、以下就介绍一下,数组的一些常用方法

	var arr = [1,2,3];
	//1.push() 后增、栈、先进后出(就是在数组后面添加元素)
	arr.push(4);
	console.log(arr); //"1,2,3,4"
	//2.pop() 后删,删除数组后面一个元素,并返回该元素
	arr.pop();
	console.log(arr); //"1,2,3"
	//3.unshift() 在数组前面添加元素(可添加多个)
	arr.unshift(5,5,5);
	console.log(arr); //"5,5,5,1,2,3"
	//4.shift() 在数组前面删除一个元素,并返回该元素
	arr.shift();
	console.log(arr);//"5,5,1,2,3"
	//5.splice(起始下标,删除的元素个数,后面的参数是在删除的坐标上添加元素内容);并返回被删的数组元素
	arr.splice(1,3,9,9);
	//console.log(arr.splice(1,3));//"5,1,2"
	console.log(arr);//"5,9,9,3"
	//当splice的第二个参数为0的时候,表示不删除,只增加,也可以不增加只删除
	//6.slice(start,end) 截取指定的元素,包含起始位置start的元素,不包含结束位置end的元素,返回一个新的结果,不影响原来的数组,就是说从新生成一个数组返回
	arr.slice(1,2);
	console.log(arr);//"5,9,9,3"
	console.log(arr.slice(1,2)); //'9'
	//slice(start);表示一直截取到数组结束的元素,没有end
	//7.concat() 用于连接两个或者多个数组后生成一个新的数组,对原来的数组没有影响
	console.log(arr.concat(8));//"5,9,9,3,8"
	var arr2 = [6,6,6];
	console.log(arr.concat(arr2));//"5,9,9,3,6,6,6"
	//concat()括号内可 传一个或者多个数组,生成一个在元数组后面拼接arr2的元素,也就是可以这样写,arr.concat(arr2,arr3)
	//8.reverse()逆序排序,会改变原数组(数组倒过来显示)
	var arr3 = [1,2,3,4];
	arr3.reverse();
	console.log(arr3);//"4,3,2,1"
	/*9.sort()
	 * 1)如果调用该方法时没有使用参数,将按字母排序,对数组中的元素进行排序,就是按照字符编码的顺序进行排序
	 * 2)按字母(字符串)排序,逐位比较
	 * 3)sort(函数)传入函数来排序
	*/
	var arr4 = [3,4,6,9,1,500];
	arr4.sort();
	console.log(arr4);//"1,3,4,500,6,9" 这样就可看见500会比6小,因为死逐位比较的,5是比6小的
	function sortNumber(a,b){
		return a-b;
	}
	arr4.sort(sortNumber);
	console.log(arr4);//"1,3,4,6,9,500"
	/*10.toString()将数组转为字符串,默认以逗号‘,’连接,就是想用alert(arr);是相当于arr.toString()转化的字符串拼接,这就是系统隐式调用,把arr内容当作字符串数拼接输出
	 * 11.join('拼接符'),将数组转为字符串,中间以指定的拼接负连接
	*/
	var str = arr4.join('-');
	console.log(str);//"1-3-4-6-9-500"
	

对象Object

讲完数组之后,现在就简短地介绍一下对象。先有一个对象的概念之后,到后面再详细在各种使用中,插入比较具体的概念。

概念:对象,是一种类型,引用类型;对象的值就是引用类型的实例。在ECMScript中引用类型是一种数据结构,用于将数据和功能组织在一起(具体存在的事物)

类:在传统的面向对象的语言中,类是对象的抽象,对象是类的具体,由类来创建对象,但ECMAScript中没有这种东西。虽然ECMScript是一门面向对象的语言,却不具备传统面向对象语言所支持的基本结构。

创建Object类型有两种:

一种是用new运算符、另外一种就是字面量表示法

//1、使用new运算符创建Object
var person = new Object();//new方法
person.name = 'kennsand';//创建属性字段
person.age = 18;//创建属性性字段
//new 关键字也是也可以省略的,这是一个合理的写法,但是是不建议的
var box = Object();

//2、使用字面量方式创建Object
var boxs = {
    name:'judy',//创建属性字段,后面用逗号隔开。这个属性字段也可以用字符串的形式如('name':'judy')
    age:'20'
}

//3、使用字面量及传统赋值方式
var box2 = {};//字面量方式声明空的对象
box2.name = 'kennsand';//点符号给属性赋值
box2.age = '19';

//4、两种属性输出方式
alert(box2.age); //19 点表示法输出
alert(box['age']); //中括号表示输出,注意引号



















往后我会继续完善原生JS的基础学习






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值