JavaScript学习(一)

1、引入Script文件,一般放到head标签内即可

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

路径问题:

./表示当前路径;

/表示根目录;

../表示上一级目录;

如果不加/,如<script src="JS/learn.js">的形式,也表示的是当前目录(所以要注意咯!);

2、调试

使用console.log()进行控制台的信息输出,在source中加断点调试,和vs调试一样;

3.类型

3.1  js是弱类型语言,使用var关键字声明,如果想知道当前操作的变量是什么类型,使用typeof关键字;typeof num即可(注意,typeof是个关键字,不是函数)。

3.2  如果一个变量未进行赋值,那么log它的值就是undefined

    注意:undefined和null不一样

3.3 注意NaN表示的不是一个数字,但是它是数字类型

4.字符

  JS中字符由""和''包裹,这两个符号表示的意思相同,之所以有两种,是方便句内引号不需要额外加转义,句内单引号,那么外包双引号,反之同理。如果句内又有单引号,也有双引号,那么加额外转义字符 即可。

 5.文档注释

单行和多行注释同c#

文档注释使用,按下/**回车即可,一般的编译器会自动补充完整

/**

*

*/

6.类型转换

parseInt()这个是从第一个字符转换成数字第一个碰到的不是数字的字符截止,返回输出结果,如果从第一个字符开始就不是数字,直接返回NaN;

7.比较运算符  ===

表示全等于,同时判断数值和数据类型,==只判断数值,所以注意"12"==12返回的是true

8.循环结构

switch中的break是可以省略的,与C#是不一样的。

9.数组

在JS中,数组是集合、队列、栈的综合体,因为可以承载各种类型的数据。

所以你可以看到这样的数组:

var arr2 = [1,'lee',[1,2,3],function a(){alert('Hi')}];
console.log(arr2[3]());
console.log((arr2[2]))

甚至放进去一个函数,然后执行。

很神奇的操作。

for in 循环  

输出数组的下标

还可以输出对象的属性名;

10.函数

函数由关键字function声明,注意函数没有返回值,因为本身就是一个var类型,有返回值直接接收就可以了,不需要显示声明。

函数的形参声明也不需要写var关键字,直接写变量名即可。

注意:

函数的声明位置不影响其调用;

原因:

所有声明的函数都属于window对象,JS有一个优先级会优先声明,所以调用和位置无关,但是这样的坏处是可能替换window对象的其他函数。

注意:

函数可以返回函数,返回值是function类型。

函数名+()直接调用函数。

类似于C#中的委托,使用一个变量表示函数

function demo()
{
	return function (){console.log("It's demo inside!")};
}
var de = demo();
de();

匿名函数(上部代码)

函数的lambda表达式

function demo(func)
{
	if(func)
	{
		func();
	}
}
function hello()
{
	console.log("This is Hello!");
}
demo(hello());//函数作为参数传递
demo(()=>console.log("lambda"));//lambda表达式

自调用函数/闭包

(function demo(num){console.log("This is "+num)})(2);

自调用函数就是让函数自己执行一次;

说明:第一个包围住函数声明的括号()表示声明函数体,紧接着后面的()表示调用函数,如果有参数,直接写在括号内。

注意:闭包的好处或者优势是什么?

答: 对于JS来说,全局变量自动添加进了window中,那么带来的负面影响就是会污染window内部本身的属性,结合下一节 作用域 的内容,你可以看到,声明在函数内的变量是局部变量,这样就不会影响到window或者是函数外的其他变量或者方法了!

11.作用域

只有在function内部声明的变量才是局部变量,除此之外的变量都是全局变量,自动添加进window对象中。  

 注意:

预解析过程:声明优先但是赋值不会优先;

console.log(a);
var a=12;

现象:控制台输出undefined。

原因:JS的优先级机制会将所有的声明放到程序最优先执行的位置,所以只要声明了就不会报错,但是赋值并不会提升到同样的优先级,而是保留到原位。

同样的;

预解析过程适用于函数的声明。

如果同时声明了同名的方法和变量:

注意:方法是覆盖对象的,可以这么理解,预解析器将声明和方法都提到了最优先级,但是声明是被提到了最上层,而方法是被放置在下一行位置。

12.对象

json对象/字面量对象

是属于一次性对象,主要用来传递信息的。

var stu = {
	id:1,
	name:"zhangsan",
	show:function (){
		console.log("This is json!");
	}
}
stu.show();

注意代码写法:

对象使用{}大括号包裹起来;

属性名和属性值之间使用:分隔;

不同的属性名使用,逗号隔开

第二种声明对象的写法

var stu = new Object();
stu.id=1;
stu.name = "lisi";
stu.show = function(){
	console.log("name "+ this.name + " id "+this.id);
}
stu.show();

注意,在声明show方法中,如果要使用stu的name,那么必须要加this.调用属性。

这其中描述了 . 的两种作用中的第二种;

①调用

②定义

注意this的使用问题;

在上一个代码中,this指向的stu

function demo(){
	console.log(this);
}

而在这个代码中,this指向的是window。

为什么?

这是因为声明的demo函数会自动添加到window对象中,所以this就变成了window。

构造函数创建对象

(function(){
	function Student(id,name,age)
	{
		this.id = id;
		this.name = name;
		this.age = age;
		this.show = function(){
			console.log("年龄"+this.age+" Id "+this.id+" 名字 "+ this.name);
		}
	}
	var stu = new Student(1,"zhangsan",12);
	stu.show();
	
	var stu1 = new Student(2,"lisi",22);
	stu1.show();
	
	for (let var1 in stu) {
		console.log(typeof stu[var1]);
		if((typeof stu[var1])!="function"){
			console.log(var1+":"+stu[var1]);
		}
	}
})();

这里用function建立了Student的构造函数,可以直接new出对象;

然后使用for in 循环打印出了不属于函数的对象的所有属性。

13.常用函数

查询mdn,东西比w3c更全,更专业!

原文地址:https://www.cnblogs.com/LeeSki/p/11619700.html