javascript相关基础
event
window.event...
键盘处理程序 onkeypress
字符代码会存放在event.which()//netscape或者event.keyCode()//IE
将ascii转换为字符串
String.fromCharCode(event.which);//event.keyCode;
全局、局部变量
任何再函数体内的用var声明的变量都是局部变量,即使和全局变量重名,也是可以的,是不同的变量
如果再函数体内不适用var,那么所声明的变量不是局部变量,如果这个时候函数体外有同名变量,就会错误的改变变量值,导致程序出错
var a = 10; function add() { a = 20; console.log(a); } add(); //20 console.log(a); //20
特性
动态性
var key = "property"
console.log(key)
var duixiang = {
property: "my canshu"
}
console.log(duixiang.property)
console.log(duixiang["property"])
console.log(duixiang[key])
delete duixiang["property"]
console.log(duixiang[key])
//property
my canshu
my canshu
my canshu
undefined弱类型
类型是和值相关的,而不是和变量相关的
定义变量无须显式声明,很大的灵活性
也有不利的一面,比如需要面向对象的时候
数据类型
原始类型:
ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
引用类型:对象
还有数组(跟对象差不多,因为都存的是首地址呀)
数组
不用new,直接"=[ ]"是一样的意思
string
.length只读属性
大小写转换
toUpperCase()
toLowerCase()
子字符串
.substring(a,b) a--(b-1)索引的字符 b可以没有
单个字符
.charAt(a)
查找字符串
.indexof("text"),返回开始的索引值
.indexof("text",2)可以指定从哪里开始查找(可以用于寻找重复的字符串)
.lastIndexOf("text") 从后向前搜索,即最后一个出现的目标,再返回索引值
.lastIndexOf("text",20) 制定位置参数,会从该位置向前搜索
分离字符串
.split(",") 返回字符串数组
合并字符串
.join(",") 返回字符串
字符串数组排序
.sort() 返回字符串数组!!!这里会改变原数组为有序哦!!!
.sort(numcompare) numcompare自定义函数,根据这个来排序
function numcom(a, b) {
return a - b;
}
strs = ['3', '4', '435', '13', '1', '2']
console.log(strs.sort(numcom));数字
处理金钱
toFixed(2) 非常适合处理金钱。 var x = 9.656; x.toFixed(0); // 返回 10 x.toFixed(2); // 返回 9.66 x.toFixed(4); // 返回 9.6560 x.toFixed(6); // 返回 9.656000
进制
但是您能够使用 toString() 方法把数输出为十六进制、八进制或二进制。 实例 var myNumber = 128; myNumber.toString(16); // 返回 80 myNumber.toString(8); // 返回 200 myNumber.toString(2); // 返回 10000000
JavaScript 会把前缀为 0x 的数值常量解释为十六进制。
绝不要用前导零写数字(比如 07)。
一些 JavaScript 版本会把带有前导零的数解释为八进制。
精确范围
整数
整数(不使用指数或科学计数***被精确到 15 位。
小数
小数的最大数是 17 位,浮点的算数并不总是 100% 精准
使用乘除法有助于解决上面的问题:
实例
var x = (0.2 * 10 + 0.1 * 10) / 10; // x 将是 0.3
===
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。
==
数字啥的对象比较会更糟糕,是因为,两个都是对象无法比较
NaN
这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:
浮点数
注意的相等比较:
Infinity
Infinity (或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值。
除以 0(零)也会生成 Infinity:
typeof Infinity; // 返回 "number"
## \- undefined
大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
\- 强烈建议直接使用[]。
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
\- 只能用var申明一次,例如:
var a = 123; // a的值是整数123
a = 'ABC'; // a变为字符串
## \- strict模式
启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict';
## \- 字符
如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
# ES6标准
\1. ES6模板字符串
console.log(\`你好, ${name}, 你今年${age}岁了!\`);
\2. 多行字符串的表示方法
反引号:\`这是一个多行字符串\`;
访问不存在的属性不报错,而是返回undefined:
xiaoming.age = 18;
// 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
\- 'name' in xiaoming; // true
这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:
'grade' in xiaoming; // false
\- 要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
\- null、undefined、0、NaN和空字符串''视为false,其他值一概视为true
\- for in
\-
var a = ['A', 'B', 'C'];
for (var i in a) {
console.log(i); // '0', '1', '2'
console.log(a[i]); // 'A', 'B', 'C'
}
\- 普通
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key); // 'name', 'age', 'city'
}
}map ES6标准
-
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
m.set('Adam', 67); // 添加新的key-value
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined多次对一个key放入value,后面的值会把前面的值冲掉
set ES6标准
- 在Set中,没有重复的key。
- 重复元素在Set中自动被过滤:
- 注意数字3和字符串'3'是不同的元素。
- 通过delete(key)方法可以删除元素:
## iterable ##
- Array、Map和Set都属于iterable类型。
-
var a = ['A', 'B', 'C'];
for (var x of a) { // 遍历Array
console.log(x);
}
\- for each
\-
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
console.log(element);
});
\- 函数
箭头函数
其本身就是匿名函数,没有函数名
// 无参数: () => 3.14
只有一个内容行,就不需要写{}花括号
x => x * x
有一个以上参数,就要加()和{}
(x, y, ...rest) => {
var i, sum = x + y;
for (i=0; i<rest.length; i++) {
sum += rest[i];
}
return sum;
}如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:
// SyntaxError:
x => { foo: x }因为和函数体的{ ... }有语法冲突,所以要改为:
// ok:
x => ({ foo: x })不能作为构造函数,不能使用new
箭头函数不绑定arguments,取而代之用rest参数...解决
let C = (...c) => {
console.log(c);
}
C(3,82,32,11323); // [3, 82, 32, 11323]箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值
箭头函数没有原型属性
箭头函数不能当做Generator函数,不能使用yield关键字
匿名函数
- 如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};function (x) { ... }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量abs
## arguments ##
- arguments.length
- arguments[0]
- arguments类似Array但它不是一个Array
- 即使函数不定义任何参数,还是可以拿到参数的值
变量
- 由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行
- 全局变量会绑定到window上
### 块级作用域的变量 ###
let
-
'use strict';
function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
}
// SyntaxError:
i += 1;
}
-const ##ES6
-
全部大写的变量
const PI = 3.14;
PI = 3; // 某些浏览器不报错,但是无效果!
### 名字空间 ###
全局变量
-
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
return 'foo';
};
重复声明定义(动态类型)
<script>
var x; // 现在 x 是 undefined
var x = 7; // 现在 x 是数值
var x = "Bill"; // 现在 x 是字符串值
document.getElementById("demo").innerHTML = x;//Bill
</script>赋值后在声明,没用,不会改成define
<script>
var x = 7;
var x; //赋值后在声明,没用,不会改成define
document.getElementById("demo").innerHTML = x;//7
</script>null
在 JavaScript 中,null 的数据类型是对象。
设置值为 null 清空对象
null === undefined // false null == undefined // true
typeof
typeof {name:'Bill', age:62} // 返回 "object"
typeof [1,2,3,4] // 返回 "object" (在 JavaScript 中数组即对象)
typeof null // 返回 "object"
typeof function myFunc(){} // 返回 "function"解构赋值 ES6
-
'use strict';
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};
var {name, age, passport} = person;
console.log('name = ' + name + ', age = ' + age + ', passport = ' + passport);
- 变量已经被声明了,再次赋值的时候,正确的写法也会报语法错误:
-
// 声明变量:
var x, y;
// 解构赋值:
{x, y} = { name: '小明', x: 100, y: 200};
- 交换
-
var x=1, y=2;
[x, y] = [y, x]
详见 https://www.liaoxuefeng.com/wiki/1022910821149312/1023021187855808
常见的 HTML 事件
| 事件 | 描述 |
|---|---|
| onchange | HTML 元素已被改变 |
| onclick | 用户点击了 HTML 元素 |
| onmouseover | 用户把鼠标移动到 HTML 元素上 |
| onmouseout | 用户把鼠标移开 HTML 元素 |
| onkeydown | 用户按下键盘按键 |
| onload | 浏览器已经完成页面加载 |
innerhtml
<script>
document.getElementById("demo").innerHTML = 5 + 6;// 会覆盖之前html元素的内容
</script><button onclick="this.innerHTML=Date()">现在的时间是?</button>//改自己按钮的元素
document.write()
在 HTML 文档完全加载后使用 document.write() 将删除所有已有的 HTML
对象
对象也是变量
var car = {type:"porsche", model:"911", color:"white"};//值以 名称:值 ,名称:值对被称为属性// 创建对象:
var person = {
firstName: "Bill",
lastName : "Gates",
id : 12345,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};引用对象的非函数属性,可以用objectName.propertyName;
函数属性,用objectName.methodName(),也就是加个“()”
比较==&===
请注意 (x==y) 与 (x===y) 的区别。
JavaScript 对象无法进行对比,比较两个 JavaScript 将始终返回 false。
不把字符串、数值和布尔值声明为对象
如:
var x = new String(); // 把 x 声明为 String 对象 var y = new Number(); // 把 y 声明为 Number 对象 var z = new Boolean(); // 把 z 声明为 Boolean 对象
他们会增加代码的复杂性并降低执行速度
字符串
字符串长度
内建属性 length 可返回字符串的长度:
script中字符串换行
写两个script,写成如下可能不换行,不保险:
document.getElementById("demo").innerHTML = "Hello \
Kitty!";某些浏览器也不允许 \ 字符之后的空格,保险做法:
document.getElementById("demo").innerHTML = "Hello" +
"Kitty!";下标访问
它让字符串看起来像是数组(其实并不是)
如果找不到字符,[ ] 返回 undefined,而 charAt() 返回空字符串。
它是只读的。str[0] = "A" 不会产生错误(但也不会工作!)
转换为数组
var txt = "Hello"; // 字符串
txt.split(""); // 分隔为字符字符串是数字的比较
| "2" < "12" | false |
|---|---|
| "2" > "12" | true |
Boolean
var oFalseObject = new Boolean(false); var bResult = oFalseObject && true; //输出 true 在 Boolean 表达式中,所有对象都会被自动转换为 true,所以 oFalseObject 的值是 true
Boolean 对象将覆盖 Object 对象的 ValueOf() 方法,返回原始值,即 true 和 false。ToString() 方法也会被覆盖,返回字符串 "true" 或 "false"。 oFalseObject.valueOf () 就可以了
false: 0、-0、null、""、false、undefined、NAN
true:其余都是
方法
for each
<body>
<p id="demo"></p>
<script>
var txt="";
var nums = ['f','ad','ad'];
nums.forEach(shuchu);
document.getElementById("demo").innerHTML = txt;
function shuchu(value,index,array){
txt += value + "<br/>";
}
</script>
</body>
输出:
f
ad
ad随机整数
Math.floor(Math.random() * 10); // 返回 0 至 9 之间的数 Math.floor(Math.random() * 11); // 返回 0 至 10 之间的数
适当的整数
//介于 min(包括)和 max(不包括)之间的随机数:
function getRndInteger(min, max) {
return Math.floor(Math.random() * (max - min) ) + min;
}
//介于 min 和 max(都包括)之间的随机数
function getRndInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1) ) + min;
}跳出
有标签的
var cars = ["BMW", "Volvo", "Saab", "Ford"];
list: {
text += cars[0] + "<br>";
text += cars[1] + "<br>";
text += cars[2] + "<br>";
break list;
text += cars[3] + "<br>";
text += cars[4] + "<br>";
text += cars[5] + "<br>";
}
//如果有标签引用,则 break 语句可用于跳出任意代码块:练习
输入字符串并排序
<form *name*="theForm">
<input *type*="text" *name*="newName" *size*="20">
<input *type*="button" *name*="add" *value*="add" *onclick*="**SortNames**()">
<textarea *cols*="60" *rows*="10" *name*="sorted">the sorts</textarea>
</form>
------------------------------------------------------
var newName = 0;
var names = [];
function SortNames() {
theName = document.theForm.newName.value;
names[newName] = theName;
newName++;
names.sort();
document.theForm.sorted.value = names.join("\n");
console.log(names, "ss")
}
prototype
function addHead(level) {
title = "h" + level;
text = this.toString();
start = "<" + title + ">";
end = "</" + title + ">";
return start + text + end;
}
String.prototype.heading = addHead;//为string增加一个方法
document.write("this is one".heading(1));
document.write("this is two".heading(2));
document.write("this is three".heading(3));for in 循环
function Card(a, b) {
this.a = a;
this.b = b;
}
var tom = new Card("tom", "1231");
for (i in tom) {
console.log(i + ":" + tom[i]);
}
//a:tom
//b:1231
查看11道真题和解析