首页 > 编程语言 > 详细

JavaScript学习笔记

时间:2019-06-01 22:00:33      阅读:86      评论:0      收藏:0      [点我收藏+]

我是一个iOS开发人员,犹记得公司刚开始让我写网页的时候,写JavaScript无提示和编译不检查错误以及不知如何在HTML里面调用JavaScript函数等问题让我痛苦不堪,一度觉得这是一门很烂的语言,随着这两年在公司陆陆续续地写了一些网页,逐渐对JavaScript有了一些认识,发现JavaScript极其灵活,后来学了一段时间node.js,JavaScript还可以用来写后端,才越发发现JavaScript的强大,我仍然是一个小白,对JavaScript没有系统地学过,一直都是边用边学,在此,写此文目的,算是重新学习一遍JavaScript,往后有时间再写一下angularjs和node.js的学习笔记。

 

一、JavaScript一般来讲分为3个部分:

1. ECMAScript:JavaScript的语法核心

2. DOM:文档对象模型,HTML各个节点,JavaScript可以操作DOM

3. BOM:浏览器对象模型,JavaScript对浏览器进行操作

本文只写一下JavaScript的语法核心的部分,接触了angularJS和node.js,发现对这两门技术不理解的最根本的问题还是对JavaScript理解得太少了

 

二、原始值和引用值

1. 原始值:存放在栈中的简单数据,如 var a = 3, b = a;  此时,a, b是两个独立的互不影响的变量,修改b的值不会影响到a,我们称 a, b 为原始值,在JavaScript中,原始值有5种:null,undefined,Number,Boolean,String

2. 引用值:存放在堆内存的对象数据,如var obj = new Object(); 此时的obj本质上是一个指针,指向一个对象的堆内存地址。

var obj1 = new Object();
obj1.name = "zhang";

var obj2 = obj1;
obj2.name = "li";

console.log(obj1.name); // "li"

以上例子中,obj2 与 obj1 两个指针都指向同一个对象,当修改obj2.name时,obj1.name 也同时改变,这应该是任何程序员都知道的概念。

 

三、undefined与null

在JavaScript中,undefined并不表示未定义的对象,它只是代表改变量未初始化,而 null 则表示该变量为空,如

var a;
alert(a); // undefined
alert(b); // 报错

当一个函数没有返回值时,返回值是undefined,如

function test () {
}
alert(test()); // undefined

 

四、Object类

Object类本身很少用,但是如同Java一样,所有对象都继承自Object类,Object类有如下几个重要方法:

1. constructor 获取该对象的类型

var c = ["red", "blue", "green"];
if (c.constructor == Boolean) {
    console.log("This is Boolean");
} else if (c.constructor == Object) {
    console.log("This is Object");
} else if (c.constructor == Array) {
    console.log("This is Array");
}
// This is Array

2. prototype 该方法作用在类上面,指向一个类的所有属性,也可以动态为类添加方法或属性

// 定义一个Persion类
function Person(name) {
    this.name = name;
}

// 给Person类添加一个setAge方法
Person.prototype.setAge = function (age) {
    this.age = age;
}

// 给Persion类添加一个值
Person.prototype.finger = 10;

var p = new Person("zhangsan");
p.setAge(25);
console.log(p.age); // 25
console.log(p.finger); // 10
console.log(Person.prototype); // age方法,finger属性及Person类本身

3. hasOwnProperty 判断一个对象是否具有某个方法或属性

var obj = new Object();
obj.test = function () {
}
obj.name = "zhang";
console.log(obj.hasOwnProperty(‘test‘)); // true
console.log(obj.hasOwnProperty(‘name‘)); // true
console.log(obj.hasOwnProperty(‘age‘)); // false

经测试,通过prototype添加的属性貌似不能用hasOwnProperty判断

4. toString 将对象转为字符串

var colors = ["red", "blue", "yellow"];
console.log(colors.toString()); // red,blue,yellow

 

五、其他常用运算符

1. instance 用来精准识别一个对象的类型

var c = ["red", "blue", "green"];
console.log(c instanceof Array); // true
console.log(typeof c); // Object

typeof具有局限性,很多情况下typeof返回一个Object,这个时候可以用instance判断,与前面的constructor类似

2. delete 可以删除对象的方法或属性

var p = new Object();
p.setName = function (name) {
    this.name = name;
}
p.setName("zhang");
delete p.setName;
p.setName("li"); // 报错

delete只能删除开发者自定义的方法或属性,不能删除JavaScript的自带方法

3. void 用于对任何返回结果都置为undefined,如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScriptTest</title>
    <script>
        function clickMe() {
            return "abc";
        }
    </script>
</head>
<body >
<a href="javascript:void(clickMe())">啊啊啊</a>
</body>
</html>

如果不加void,则点击之后链接会跳转,加上void,点击链接之后什么也不会发生

 

六、JavaScript函数

(1)函数定义:JavaScript函数非常神奇,最常见的两种函数定义如下

// 写法1
function func1 (arg1, arg2) {
    console.log("func1");
}

// 写法2
var func2 = function (arg1, arg2) {
    console.log("func2");
}

以上两种函数定义方法略有区别:func1不管是写在前面还是后面,func1在脚本执行的时候会马上定义;而func2类似一个变量,一定要先定义func2,再执行func2(),否则会报错

func1();
function func1 (arg1, arg2, arg3) {
    console.log("func1");
    func3();
    return;
    function func3() { // func3可以透过return定义,因为他只要一执行func1,func3马上被定义
        console.log("func3");
    }
}

func2();
var func2 = function (arg1, arg2) {
    console.log("func2");
}

// func1
// func3
// 报错

(2)函数重载:JavaScript函数不能重载(所谓重载,也就是函数名称相同,函数的参数个数或参数类型不同),他会被后面的函数给覆盖

function clickMe() {
    alert(100);
}
function clickMe(x) {
    alert(x);
}
clickMe(); // undefined

此处clickMe()里面并未传参,但是他执行的不是第一个函数,而是第二个

(3)函数的arguments对象:

JavaScript函数中,有一个特殊的对象arguments,可以通过arguments获取函数的任何一个参数

function func1 (x, y, z) {
    console.log("x = " + x + ", y = " + y + ", z = " + z);
    console.log("x = " + arguments[0] + ", y = " + arguments[1] + ", z = " + arguments[2]);
}
func1(3, 4, 5);
// x = 3, y = 4, z = 5
// x = 3, y = 4, z = 5

arguments还可以用来检测函数的参数个数,arguments.length, 虽然func1的定义中是三个参数,但其由于没有重载,实可以传递更多或更少的参数,与其他的编程语言大不相同,JavaScript的自由度如此之大,是不是惊呆了!

(4)Function类

函数的定义方式除了上面介绍的两种,还有一种用类创建实例的方法创建一个函数

var func1 = new Function("arg1", "arg2", "return arg1*arg2");
console.log(func1(3, 4)); // 12

由于是参数和函数体都是字符串的关系,写起来比较困难,读起来也不爽,所以实际上没见过有人用Function类来创建函数的,不过可以用这种写法来说明函数重载的问题

var clickMe = new Function("alert(100)");
var clickMe = new Function("x", "alert(x)");
clickMe(); // undefined

现在知道为什么会执行第二个函数了,第一个函数被重写覆盖了

(5)函数闭包

function add() {
    function doAdd (x, y) {
        return x + y;
    }
    var s = 0;
    for (var i = 0; i < arguments.length; i++) {
        s = doAdd(s, arguments[i]);
    }
    return s;
}
var sum = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
console.log(sum); // 55

doAdd函数就是add函数的一个闭包,他在add函数里面,不受外界影响

 

七、JavaScript对象

(1)JavaScript对象可以分为3种:

    1. 本地对象 JavaScript语法本身提供的对象,如Object,Array,String,Boolean,Number,Date,Function等

    2. 内置对象 JavaScript有一个顶层的全局对象,在JavaScript中,实际上不存在独立的函数,所有的函数都必须是某一个对象的方法,如isNAN(),parseIn(),eval()等,我们在使用它们的时候并未写出其具体是那个对象调用的方法,他是属于全局对象的方法;另外还有Math对象,如Math.floor()等

    3. 宿主对象 JavaScript运行环境提供的对象,如DOM,BOM等

(2)JavaScript对象的一些常用方法

Array对象:concat(),slice(),push(),pop(),shift(),unshift(),reverse(),splice()

String对象:concat(),slice(),split()

内置对象提供了一个eval() 方法,这是一个解释程序,它可以把一段字符串解释成一段JavaScript代码,如

var str = "function sayHi(s) {alert(s)}";
eval(str);
sayHi("hello"); // 弹出 "hello"

再一次见证了JavaScript的灵活和强大!

(3)作用域

与其他的面向对象语言不一样,JavaScript中任何对象的函数或属性都是公共的

(4)关键字this

this总是指向调用该方法的对象

function sepakLanguage() {
    alert(‘I speak ‘ + this.language);
}
var obj1 = new Object();
obj1.language = "Chinese";
obj1.sepak = sepakLanguage;
obj1.sepak(); // I speak Chinese

var obj2 = new Object();
obj2.language = "English";
obj2.sepak = sepakLanguage;
obj2.sepak(); // I speak English

以上方法中,sepakLanguage中要引用对象的属性时,必须使用this关键字

 

未完待续。。。

JavaScript学习笔记

原文:https://www.cnblogs.com/i-o-s-/p/10959948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!