JavaScript学习记录day2

JavaScript学习记录day2

学习 javascript

1. 数据类型和变量

1.1 数据类型

1.1.1 Number

JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型:

123; // 整数1230.456; // 浮点数0.4561.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5-99; // 负数NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity

计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等,它们和十进制表示的数值完全一样。

Number可以直接做四则运算,规则和数学一致:

1 + 2; // 3(1 + 2) * 5 / 2; // 7.52 / 0; // Infinity0 / 0; // NaN10 % 3; // 110.5 % 3; // 1.5

注意%是求余运算。

1.1.2 字符串

基本用法和python一样。

ASCII码:

‘\x41‘; // ASCII码,完全等同于 ‘A‘

Unicode字符:

‘\u4e2d\u6587‘; // 完全等同于 ‘中文‘

多行字符串: 
由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ... 表示:

`这是一个多行字符串`;

模板字符串:

console.log(‘这是‘ + ‘拼接‘ + ‘字符串‘);

var name = ‘小明‘;var age = 20;var message = `你好, ${name}, 你今年${age}岁了!`;alert(message);

字符串长度:

var s = ‘Hello, world!‘;console.log(s.length); // 13

要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:

var s = ‘Hello, world!‘;

s[0]; // ‘H‘s[6]; // ‘ ‘s[7]; // ‘w‘s[12]; // ‘!‘s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined

需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:*

var s = ‘Test‘;s[0] = ‘X‘;console.log(s); // s仍然为‘Test‘

JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:

toUpperCase 
toUpperCase()把一个字符串全部变为大写:

var s = ‘Hello‘;s.toUpperCase(); // 返回‘HELLO‘

toLowerCase 
toLowerCase()把一个字符串全部变为小写:

var s = ‘Hello‘;var lower = s.toLowerCase(); // 返回‘hello‘并赋值给变量lowerlower; // ‘hello‘

indexOf 
indexOf()会搜索指定字符串出现的位置:

var s = ‘hello, world‘;s.indexOf(‘world‘); // 返回7s.indexOf(‘World‘); // 没有找到指定的子串,返回-1

substring 
substring()返回指定索引区间的子串:

var s = ‘hello, world‘s.substring(0, 5); // 从索引0开始到5(不包括5),返回‘hello‘s.substring(7); // 从索引7开始到结束,返回‘world‘

1.1.3 布尔值

false/true

1.1.4 比较运算符

当我们对Number做比较时,可以通过比较运算符得到一个布尔值:

2 > 5; // false5 >= 2; // true7 == 7; // true

实际上,JavaScript允许对任意数据类型做比较:

false == 0; // truefalse === 0; // false

要特别注意相等运算符==。JavaScript在设计时,有两种比较运算符: 
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果; 
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。

另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:

NaN === NaN; // false

唯一能判断NaN的方法是通过isNaN()函数:

isNaN(NaN); // true

最后要注意浮点数的相等比较:

1 / 3 === (1 - 2 / 3); // false

这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:

Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

1.1.5 null和undefined

null表示一个“空”的值,它和0以及空字符串”不同,0是一个数值,”表示长度为0的字符串,而null表示“空”。

在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。

JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。

1.1.6 数组

写法和python中列表一样。 
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。例如: 
[1, 2, 3.14, ‘Hello‘, null, true]; 
上述数组包含6个元素。数组用[]表示,元素之间用,分隔。

另一种创建数组的方法是通过Array()函数实现: 
new Array(1, 2, 3); // 创建了数组[1, 2, 3] 
然而,出于代码的可读性考虑,强烈建议直接使用[]

数组的元素可以通过索引来访问。请注意,索引的起始值为0:

var arr = [1, 2, 3.14, ‘Hello‘, null, true];arr[0]; // 返回索引为0的元素,即1arr[5]; // 返回索引为5的元素,即truearr[6]; // 索引超出了范围,返回undefined

JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。

数组长度 
要取得Array的长度,直接访问length属性:

var arr = [1, 2, 3.14, ‘Hello‘, null, true];arr.length; // 6

修改数组 
请注意,直接给Array的length赋一个新的值会导致Array大小的变化:

var arr = [1, 2, 3];arr.length; // 3arr.length = 6;arr; // arr变为[1, 2, 3, undefined, undefined, undefined]arr.length = 2;arr; // arr变为[1, 2]

Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:

var arr = [‘A‘, ‘B‘, ‘C‘];arr[1] = 99;arr; // arr现在变为[‘A‘, 99, ‘C‘]

请注意,如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:

var arr = [1, 2, 3];arr[5] = ‘x‘;arr; // arr变为[1, 2, 3, undefined, undefined, ‘x‘]

大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误。在编写代码时,不建议直接修改Array的大小,访问索引时要确保索引不会越界。

indexOf 
与String类似,Array也可以通过indexOf()来搜索一个指定的元素的位置:

var arr = [10, 20, ‘30‘, ‘xyz‘];arr.indexOf(10); // 元素10的索引为0arr.indexOf(20); // 元素20的索引为1arr.indexOf(30); // 元素30没有找到,返回-1arr.indexOf(‘30‘); // 元素‘30‘的索引为2

注意了,数字30和字符串’30’是不同的元素。

slice 
slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array:

var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘];arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: [‘A‘, ‘B‘, ‘C‘]arr.slice(3); // 从索引3开始到结束: [‘D‘, ‘E‘, ‘F‘, ‘G‘]

注意到slice()的起止参数包括开始索引,不包括结束索引。

如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array:

var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘];var aCopy = arr.slice();aCopy; // [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘]aCopy === arr; // false

push和pop 
push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:

var arr = [1, 2];arr.push(‘A‘, ‘B‘); // 返回Array新的长度: 4arr; // [1, 2, ‘A‘, ‘B‘]arr.pop(); // pop()返回‘B‘arr; // [1, 2, ‘A‘]arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次arr; // []arr.pop(); // 空数组继续pop不会报错,而是返回undefinedarr; // []

unshift和shift 
如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:

var arr = [1, 2];arr.unshift(‘A‘, ‘B‘); // 返回Array新的长度: 4arr; // [‘A‘, ‘B‘, 1, 2]arr.shift(); // ‘A‘arr; // [‘B‘, 1, 2]arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次arr; // []arr.shift(); // 空数组继续shift不会报错,而是返回undefinedarr; // []

sort 
sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序:

var arr = [‘B‘, ‘C‘, ‘A‘];arr.sort();arr; // [‘A‘, ‘B‘, ‘C‘]

能否按照我们自己指定的顺序排序呢?完全可以,我们将在后面的函数中讲到。

reverse 
reverse()把整个Array的元素给掉个个,也就是反转:

var arr = [‘one‘, ‘two‘, ‘three‘];arr.reverse(); arr; // [‘three‘, ‘two‘, ‘one‘]

splice 
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:

var arr = [‘Microsoft‘, ‘Apple‘, ‘Yahoo‘, ‘AOL‘, ‘Excite‘, ‘Oracle‘];// 从索引2开始删除3个元素,然后再添加两个元素:arr.splice(2, 3, ‘Google‘, ‘Facebook‘); // 返回删除的元素 [‘Yahoo‘, ‘AOL‘, ‘Excite‘]arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘]// 只删除,不添加:arr.splice(2, 2); // [‘Google‘, ‘Facebook‘]arr; // [‘Microsoft‘, ‘Apple‘, ‘Oracle‘]// 只添加,不删除:arr.splice(2, 0, ‘Google‘, ‘Facebook‘); // 返回[],因为没有删除任何元素arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘]

concat 
concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:

var arr = [‘A‘, ‘B‘, ‘C‘];var added = arr.concat([1, 2, 3]);added; // [‘A‘, ‘B‘, ‘C‘, 1, 2, 3]arr; // [‘A‘, ‘B‘, ‘C‘]

请注意,concat()方法并没有修改当前Array,而是返回了一个新的Array。 
实际上,concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:

var arr = [‘A‘, ‘B‘, ‘C‘];arr.concat(1, 2, [3, 4]); // [‘A‘, ‘B‘, ‘C‘, 1, 2, 3, 4]

join 
join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:

var arr = [‘A‘, ‘B‘, ‘C‘, 1, 2, 3];arr.join(‘-‘); // ‘A-B-C-1-2-3‘

如果Array的元素不是字符串,将自动转换为字符串后再连接。

多维数组

如果数组的某个元素又是一个Array,则可以形成多维数组,例如:

var arr = [[1, 2, 3], [400, 500, 600], ‘-‘];

上述Array包含3个元素,其中头两个元素本身也是Array。

对象 
写法和python中字典类似,对象属性的用法和python类属性的用法一样。 
JavaScript的对象是一组由键-值组成的无序集合,例如:

var person = {    name: ‘Bob‘,    age: 20,    tags: [‘js‘, ‘web‘, ‘mobile‘],    city: ‘Beijing‘,    hasCar: true,    zipcode: null};

JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为’Bob’,zipcode属性为null。

要获取一个对象的属性,我们用对象变量.属性名的方式:

person.name; // ‘Bob‘person.zipcode; // null

由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:

var xiaoming = {    name: ‘小明‘};xiaoming.age; // undefinedxiaoming.age = 18; // 新增一个age属性xiaoming.age; // 18delete xiaoming.age; // 删除age属性xiaoming.age; // undefineddelete xiaoming[‘name‘]; // 删除name属性xiaoming.name; // undefineddelete xiaoming.school; // 删除一个不存在的school属性也不会报错

如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:

var xiaoming = {    name: ‘小明‘,    birth: 1990,    school: ‘No.1 Middle School‘,    height: 1.70,    weight: 65,    score: null};‘name‘ in xiaoming; // true‘grade‘ in xiaoming; // false

不过要小心,如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:

‘toString‘ in xiaoming; // true

因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。

要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:

var xiaoming = {    name: ‘小明‘};xiaoming.hasOwnProperty(‘name‘); // truexiaoming.hasOwnProperty(‘toString‘); // false

1.2 变量

变量 
var只能声明一次,变量本身类型不固定。javascripts属于动态语言。 
strict模式

‘use strict‘;

var test = ‘必须加var,否则报错‘;

学习参考教程:http://www.liaoxuefeng.com

时间: 2024-08-07 10:03:30

JavaScript学习记录day2的相关文章

JavaScript学习记录day1

JavaScript学习记录day1 学习 javascript JavaScript学习记录day1 1. 快速入门 2. 编程工具 3. 语法 4. 注释 5. 大小写 JavaScritps 是什么? JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 在Web世界里,只

javascript 学习记录

关于牛B的Jquery源头 (function(){ //这里省略jQuery所有实现 })(); 1:无论你怎么去定义你的函数 JS解释器都会把它翻译成一个 Function对象 2:那什么是Function? Function对象是javascript里面 固有对象,所有的函数实际上都是一个 Function对象 3: alert(typeof function(){});// "function" alert(typeof function(x,y){return x+y;});

JavaScript学习记录day5-函数的定义和调用

JavaScript学习记录day5-函数的定义和调用 [TOC] 1. 定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义:abs是函数的名称:(x)括号内列出函数的参数,多个参数以,分隔:{ ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句.请注意,函数体内部的语句在

JavaScript学习记录day7-高阶函数

JavaScript学习记录day7-高阶函数 [TOC] 1. 什么是高阶函数 高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, Math.abs)时,参数x,

JavaScript学习记录day9-标准对象

JavaScript学习记录day9-标准对象 [TOC] 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串: typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typ

诶西,JavaScript学习记录。。。。。。

由于大学课程缘故,老师巨爱叫人问问题,还记分呢,随便记录一下Js的学习情况,以后复习什么的也比较方便吧...... 开始咯,就按照C语言学习那样的方法来吧! ==================================割割割================================== 1.数据类型(这里只是大概提一下) 1 /* 2 我认为Js里没有明显的数据类型,仅有 字符串.数字.布尔.数组.对象.Null.Undefined 3 */ 4 5 var temp = 'leg

Javascript学习记录——原生JS实现旋转木马特效

昨天学习到了JS特效部分,然后老师讲了旋转木马特效的实现,如上图.不过只是讲了通过点击箭头实现图片的切换,对于点击图片本身以及二者联动却是没有讲解. 本着一颗追求完美的心,今天花费了一个中午终于将整个功能全部完善(死了太多脑细胞~~). 接下来直接进入主题哈~(主要讲解JS,所以对其中的HTML及CSS不做详细说明.) 首先是HTML代码 <!DOCTYPE html> <html> <head lang="en"> <meta charset

Javascript学习记录——一次小项目的总结

这几天都忙着上课还有准备项目,没有时间写博客,今天总是完成了项目的评比,有点失落,有点感悟. 背景:博主是传智博客的培训生,学完了html,css,以及js特效,班级共84人,项目分为8组,博主有幸担任第8组组长. 项目概况:每个组各自以一个网站为模板进行模仿,页面为非静态页面,时间为1周,包括上课时间.(博主用的原生js) 项目完成过程: 1.接到任务当天,博主便组织小组成员在晚自习时间进行一次简单的讨论,然后发布任务,每人选择两个自己中意的网站,并说明理由,第二天将要写的网站定下来. 2.次

JavaScript学习记录总结(八)——全选、反选

<!DOCTYPE html><html><head><title>checkboxs.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"><meta name="description" content="this is my page"><me