JavaScript 笔记

是什么:What

是一种脚本语言,用于执行网页上的动作
(内容由 HTML 语言书写,格式由 CSS 规范,动作由 JS 来执行)

JS 是一种解释性的语言,与 Java 这种强类型的语言无关

特点是什么

  1. 解释性语言

适用/不适用场合

。。。

如何编写

Hello World

<body></body> 中放入如下代码

<!--first JS-->
<script>
    document.write("Hello World");
</script>

字符串输出

document.write("Here is the string for output.") 中的字符串是 HTML 流,即可包括 <br/> 等 HTML 标签

注意:

  • document.write() 中,换行应该通过在字符串中用 <br/> 输出;输出转义字符 \n 在这里无法起到换行的效果;在
  • alert() 中,换行字符则使用 \n

变量定义

  • JS 中使用 var VariableName = Value 来把值 Value 赋予变量 VariableName
  • 值有类型,变量则不需要事先规定类型
  • JS 中,变量作用域只有 2 个空间:函数内部空间,全局空间
<!--variable setting-->
<script>
    var HW;
    HW = "Hello World";
    document.write(HW);
    //same effect as 'first JS'
</script>

判断

if-else statement

类似 C/C++

    if (expr1){
      //do something
    }
    else if (expr2){
      //do something
    }
    else{
      //do something
    }

示例如下

<script>
    var age = 20;
    var ADULT = 18;
    var teenage = 12;
    document.write("Your age is " + age + ".");
    if (age >= ADULT){
      alert("Adult.");
    }
    else if (age >= teenage){
      alert("Teenage.");
    }
    else{
      alert("Children.")
    }
    //page message: "Your age is 20."
    //alert message: "Adult."
</script>

关系运算符(三元运算符)

<expr>?<v1>:<v2>
//the same effect as:
//if (<expr>)
//{v1}
//else
//{v2}

例如,这这段代码

max = (a > b)?a:b;

与这段代码效果一致

if (a > b)
{
  max = a;
}
else
{
  max = b;
}

case-switch statment

类似 C/C++

switch(VariableName){
    case value1:
        //code block 1
        break; //otherwise the code below will run.
    case value2:
        //code block 2
        break; //otherwise the code below will run.
    default:
        //code block 3
}

逻辑运算符

  • and: &&
  • or: ||
  • not: !

循环

while loop

类似 C/C++

while(expr1){
  //while expr1 == true, do something
}

do-while loop

类似 C/C++

do{
  //do something
  //if expr1 == true, loop; else, break
}while(expr1)

for loop

类似 C/C++

for (init; condition; step){
    //do something
}

例如

for (i = 0; i < 5; i++){
    document.write(i);
}
//print 01234

break

控制效果与 C/C++ 一致

contuine

控制效果与 C/C++ 一致

函数

定义方式

function fun_para_0(){
    document.write('function without any parameters.');
}
function fun_para_1(a){
    return (a + 10);
}
function fun_para_2(n1, n2){
    document.write(n1 + n2);
}


fun_para_0();//function without any parameters.
document.write(fun_para_1(15));//25
fun_para_2(1, 2);//3

函数变量

var f = Function("x", "y", "return x*y");
//seems same effect as
//
//function f(x, y){return x*y;}
//
//may be useful in advanced applications one day, use function as variable

重复定义与调用

后面的函数定义将覆盖之前的函数定义:意思是无论你定义+调用多少次函数 myf1,总之所有对 myf1 的调用都将以最后一次对该函数的定义为准。例如如下的 HTML 代码配合如下的 JS 代码,输出的效果如图所示:

HTML 代码:

<html>
  <head>
    <title>js03</title>
  </head>

  <body>
    <p> hello js03 </p>

    <script src="run.js"></script>

    <script>
    function my_func(){
    document.write(1);
    }

    my_func()

    document.write("<br>");

    function my_func(){
      document.write(2);
      }

      my_func()
      </script>
  </body>
</html>

JS 代码:

function myf1()
{
    var i = 7;
    while (i >= 0)
    {
        document.write("This is number " + i + ".<br/>");
        i--;
    }

}

myf1();

document.write("------when overridden------<br/>");

function myf1()
{
    document.write("Hello world! This is js03.");
}

myf1();

document.write("<br/><br/>THE END.");

效果图:

JS 中重复定义函数
JS 中重复定义函数

数组

定义方式

var a = new Array();// way 1
var b = new Array(size);// way 2
var c = new Array(digit_1, digit_2, ..., digit_n);// way 3; if only one parameter, the sentence will be treated as way 2
var d = [digit_1, digit_2, ..., digit_n]; // way 4

数组长度

var ar = new Array(100);
document.write(ar.length); // print 100

尾部添加元素

var ar = new Array(size);
ar[ar.length] = Elem0;
``

> 以字符串形式输出数组的 4 种方式

```JS
var ar = ['W', 'H', 'O'];
alert(ar); //way 0
alert(ar.toString());//way 1. same effect as way 0
alert(ar.valueOf());//way 2. same effect as way 0
alert(ar.join(char));//use char to connect each element of the array

堆栈操作

var ar = new Array();
var count = ar.push(item0, item1, item2); //item0 is on the bottom; count == 3
var topItem = ar.pop(); //topItem == item2

队列操作

var ar = new Array();
var count = ar.push(item0, item1, item2); //item0 is on the bottom; count == 3
var topItem = ar.shift(); //topItem == item0

排序

按字符串顺序,从小到大排序

var values = ['hello', 'gello', 'hellp'];
values.sort();
alert(values); // gello, hello ,hellp; if values == [0,1, 5, 10, 15], here is: 0, 1, 10, 15, 5

按输入顺序反向输出

var values = ['hello', 'gello', 'hellp'];
values.reverse();
alert(values); // hellp, gello ,hello

连接数组

var values = ['k','i','s','s'];
var obj = ['y', 'o', 'u'];
var hello = values.concat(obj);
alert(hello);//k,i,s,s,y,o,u

数组切片

左闭右开

var values = ['k','i','s','s'];
var hello = values.slice(1, 4);
alert(hello);//i, s, s

splice(开始位置, 删除个数, 插入元素0, 插入元素1, ...)

删除

var values = ['k','i','s','s'];
values.splice(0, 2);
alert(values);//s, s

插入

var values = ['k','i','s','s'];
values.splice(values.length, 'you');
alert(values);//k,i,s,s,you

替换

var values = ['k','i','s','s'];
values.splice(1, 2, 'a', 'i');
alert(values);//k,a,i,s

对象

定义对象

var obj1 = new Object();//way1
var obj2 = {x:1, y:2, z:3}//way2

删除对象属性

delete obj2.x;
document.write(obj2.x)//undefined

或者

obj2.x = null;
document.write(obj2.x)//null

遍历对象属性

obj = {name:"Potter", age: 14, gender: "male"};
for (var x in obj){
    document(obj[x] + "<br>");//random access in object
}
//print:
//Potter
//14
//male

构造函数

  1. 不直接制造对象
  2. 用 this 来指代构造出的对象,用于定义成员
  3. 没有 return
function ClassName(para_1, para_2, ...){
    this.attrib_1 = para_1;
    this.attrib_2 = para_2;
    //...
    this.attrib_n = function(){
        //use this.attrib_1, ..., this.attrib_i, otherwise this.atrrib_n returns a value which doesn't change when this.attrib_1, ..., this.attrib_i change.
        //For example, it will keep the value counted using para_1, ..., para_i.
    };
    //etc.
}

var obj = new ClassName(p1, p2, ...);

注意构造函数内部的方法应使用函数属性,而非参数。否则内部方法导出的值不随着属性的改变而改变。考虑如下两段代码的输出差异:

如下代码输出 50, 100:

function Rect(w, h){
    this.width = w;
    this.height = h;
    this.area = function(){
        return this.width * this.height;
    };
}

var r0 = new Rect(5, 10);
alert(r0.area());
r0.width = 10;
alert(r0.area());

如下代码输出 50, 50:

function Rect(w, h){
    this.width = w;
    this.height = h;
    this.area = function(){
        return w * h;
    };
}

var r0 = new Rect(5, 10);
alert(r0.area());
r0.width = 10;
alert(r0.area());

原型对象

使用 prototype 可为对象原型(而非实例 instance)增加属性,例如

function Person(){} //构造了一个空对象
Person.prototype.name = "Default Name" //此后,所有 Person 对象均有 1 个新属性,属性名 name,初始值 "Default Name"
Person.prototype.gender = "Female" //此后,所有 Person 对象均有 1 个新属性,属性名 gender,初始值 "Female"
var person1 = new Person();//person1.name == "Default Name", person1.gender = "Female"
var person2 = new Person();//person2.name == "Default Name", person2.gender = "Female"
person1.name = "Harry Potter"; // person1.name == "Harry Potter"; 不影响 person2
Person.prototype.gender = "Male";//此后,person1.gender == "Male",person2.gender == "Male"
Person.prototype.age = 14; //此后,person1 增加了 1 个属性 age,值为 14;person2 也有同样的效果

注意一个问题:使用原型后,在实例为原型设定的属性赋值之前,所有实例的属性是指向同一原型的。例如

function Person(){}
Person.prototype = {
    name = "Default Name";
    fruit = ["apple", "pear", "peach"];
}

var p1 = new Person();//p1.fruit == ["apple", "pear", "peach"]; p1.fruit 指向 Person.prototype.fruit
var p2 = new Person();//p2.fruit == ["apple", "pear", "peach"]; p2.fruit 指向 Person.prototype.fruit
p1.fruit.push("banana"); //此后, p1.fruit 与 p2.fruit 内容一致,均为 ["apple", "pear", "peach", "banana"];

结合原型与构造函数,我们可以既有共享部分(使用 prototype),又有单独部分(使用关键字 this):

function Person(){
    this.name = "Default Name";
    this.fruit = ["apple", "pear", "peach"];
}

Person.prototype = {
    gender = "Male";
    age = 14;
    sayName = function(){
        alert(this.name);
    }
}

所有对象都是全局对象 window 的成员

  • 浏览器的全局对象是 window,所有的「全局变量」都是 window 的成员
  • document 是全局对象 window 的成员,表示浏览器窗口的 HTML 页面,页面上的元素都是 document 的成员

JS 加载方式

  • <script></script> 中嵌入代码
  • <script> 标签的 src 属性中指明 JS 对应 URL
  • 某个 HTML 标签的事件处理器中指明
    • 一些特殊的事件处理器如
      • 普通标签:onMouseOver, onMouseOut, onMouseClick, onMouseDoubleClick
      • body:onLoad, onUnload
      • 对话框:alert(), prompt(), confirm()
        • alert():单一提示对话框
        • prompt():对话框提示输入 1 个值
          • 例如:var name = prompt("Input your name: ");
        • confirm():对话框提示「是/否」,返回 1 或 0
          • 例如:if (confirm("Are you kidding?")) { alert("Ouch!");} else {alert("Thank you.");}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容