JavaScript学习(1)之JavaScript基础
JavaScript学习(1)之JavaScript基础
由于工作原因,开发语言逐渐以JavaScript为主,所以,抽空学习了下JavaScript语法。等现阶段的工作稳定之后,陆续会分享下自己在学习和开发过程中的一些经验总结。本着"技多不压身"的原则以及对各种编程语言的热爱,虽然笔者一直从事游戏开发工作,也愉快而又义无反顾的加入了JavaScript阵营。
1、JavaScript概述以应用范围
1.1 JavaScript概述
首先,JavaScript是一门动态类型的编程语言。支持面向对象、函数式等编程范式。同时,它也是运行在宿主环境下的轻量级的脚本语言,例如:浏览器,JavaScript代码可嵌入到HTML页面中。当然,也有应用基于Node.js的服务器环境。可以说它是主流浏览器都支持的脚本语言,这也造就了JavaScript在PC、手机、平板等环境处理与网页交互时的天然优势。随着HTML5的推广与广泛应用,出现了大量基于JavaScript的跨平台框架和游戏引擎,是通往全栈开发很值得学习的一门编程语言。正如在编程语言界流行着“世界终将是JS的”的槽点,足以可见JavaScript的强大。
1.2 JavaScript应用范围
web前端:最近比较火的Vue.js、React、 Angular等等前端框架层出不穷。
手机app:React Native、PhoneGap、Weex等跨平台移动框架等,以及微信小程序等。
游戏引擎:Cocos2d-js、Unity、egret等引擎都支持JavaScript脚本语言。
服务器:pomelo、Node.js等。
2、基本概念
2.1 语法
JavaScript语法中大量借鉴了C和Java、Perl等语言的语法,因此熟悉这些语言的人再来学习JavaScript会感觉似曾相识。但JavaScript与Java是两回事,JavaScript完全是蹭了当年Java的热度,来推动自己。
一个完整的JavaScript实现由下面三个不同的部分组成:
- 核心(ECMAScript)
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
ECMAScript:
定义了语言的基础,规定并对该语言在语法、类型、语句、关键字、保留字、操作符、对象等方面作了具体描述,并不包含输入和输出。
DOM:
文档对象模型(Document Object Model)是XML和HTML的编程接口。DOM会把整个页面映射为一个多层节点结构树,程序可以对结构树进行添加、删除、替换或修改任何节点。
BOM:
浏览器对象模型(Browser Object Model)支持访问和操作浏览器窗口。
注:以下描述就不区分ECMAScript和JavaScript,也不简称js,均统称JavaScript。
2.2 标识符
这里的标识符,统指变量名、函数名、属性名以及函数参数的名字。那么,标识符的命名有以下规则:(这些规则跟C、Java等语言类似)
- 第一个字符必须是一个字母、下划线_或者美元符号$
- 其他字符则可以是字母、数字、下划线和美元符号。
- 不能使用关键字、保留字来定义标识符。例如:if、for等。
注:在JavaScript中,变量名、函数名甚至操作符等是区分大小写的。即name和Name代表的是两个不同的变量。
2.3 注释
单行注释使用//。例如:
// 这是一个单行注释
多行注释使用/***/结构。例如:
/** 这是一个多行注释*/
2.4 严格模式
启用严格模式,会对一些不确定的行为或不安全的操作抛出错误。在脚本的顶部添加如下字符串:
"use strict";
也可以添加到函数内部,来指定该函数在严格模式下执行。
2.5 语句
JavaScript中每条语句都是以分号结尾,但分号不是必需的。但建议是不要省略分号,来避免如不完整的输入等问题。语句块用花括号包含。
2.6 变量
可以使用var
关键字来定义变量,JavaScript的变量可以用来保存任何类型的数据。例如:
var name = "AlphaGL";name = 18;name = function() {};
也可以使用逗号来定义多个变量。例如:
var name = "AlphaGL",age = 18,work = true;
虽然JavaScript支持这种写法,一般不推荐。不仅可读性差,而且易出错。
在函数内声明的变量,那么该变量的作用域为该函数内。例如:
function test() {var name = "AlphaGL";
}test();
console.log(name); // ReferenceError: name is not defined
虽然可以去掉var声明来解决这个问题,例如:
function test() {name = "AlphaGL";
}test();
console.log(name);
这时,name就成了全局变量。一般不推荐这种做法。全局变量难以维护,而且容易导致结构混乱。
3、数据类型
JavaScript中数据类型主要有:Number、String、Boolean、Object、undefined、null这几种类型。以及涉及到类型判断时会用到的操作有:typeof、instanceof、Object.prototype.toString。
3.1 Number
(1)JavaScript中并不区分整型或浮点数,所有数字均统一采用64位浮点数表示。可用Number.MIN_VALUE和Number.MAX_VALUE来获取Number类型的值的范围。
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
(2)NaN
非数值(Not a Number)是一个特殊的数值。当算术运算返回一个未定义或无法表示的值时,就产生NaN了。
console.log(typeof(NaN)); // number
console.log(0 / 0); // NaN
console.log("hello" / 5); // NaN
console.log(NaN + 1); // NaN
注:0除以0会返回NaN。其它数除以0不会。
判断一个变量是否是非数值,可以使用isNaN()函数。
console.log(isNaN(NaN)); // true
console.log(NaN == NaN); // false
console.log(isNaN("hello")); // true,"hello"不能转换成数值
console.log(isNaN(true)); // false
console.log(isNaN(false)); // false
console.log(isNaN(5)); // false
console.log(isNaN("5")); // false
注:NaN与其它所有值都不相等,包括它自己。因此判断NaN不要用
==
或===
。
(3)Infinity(正无穷)和-Infinity(负无穷)
JavaScript中还有两个特殊的数值Infinity和-Infinity。
console.log(typeof(Infinity)); // number
console.log(typeof(-Infinity)); // number
console.log(1 / 0); // Infinity
console.log(1 / -0); // -Infinity
判断一个变量是否是有穷数,可以使用isFinite()函数。
console.log(isFinite(Infinity)); // false
console.log(isFinite(-Infinity)); // false
console.log(isFinite(NaN)); // false
console.log(isFinite(0)); // true
console.log(isFinite("0")); // true
3.2 String
(1)String类型字符串是由单引号或双引号包括的零个或多个字符序列。
var key = "hello";
var value = 'world';
(2)字符串可以像数组一样访问,但一旦字符串的值确定了,就不能改变。
var foo = "Java";
foo[0] = "S";
console.log(foo); // Javafoo = foo + "Script";
console.log(foo); // JavaScript
(3)toString()与String
var a = 5;
var b = false;
var c = "AlphaGL"
var d = new Date();console.log(a); // 5
console.log(b); // false
console.log(c); // AlphaGL
console.log(d); // 2017-05-12T05:54:30.547Z
console.log(String(5)); // 5
console.log(String(false)); // false
console.log(null); // null
console.log(undefined); // undefined
还有一些常规的String操作的api,可以查阅JavaScript的String api文档。
3.3 Boolean
该类型只有两个字面值:true和false。需要强调的是,true不一定是1,false也不一定是0。其它类型转换成Boolean类型时,有一下规则:
- Boolean
true转换成true,false转换成false。 - String
任何非空字符串转换成true,空字符串("")转换成false。 - Number
任何非零数字值(包括无穷大)转换成true,0和NaN转换成false。 - Object
任何对象转换成true,null转换成false。 - Undefined
undefined转换成false。
console.log(Boolean("AlphaGL")); // true
console.log(Boolean("false")); // true
console.log(Boolean("")) // false
console.log(Boolean(10)); // true
console.log(Boolean(Infinity)); // true
console.log(Boolean(-Infinity)); // true
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(new Date())); // true
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
综上:当值为0,null,false,NaN,undefined,空字符串("")转换成Boolean类型时值都为false,其它任何值都为true。
以下实例:
(1)
var x;
if (x) {console.log("test1")
}else {console.log("test2")
}
输出:test2
(2)
var x = null;
if (x) {console.log("test1")
}else {console.log("test2")
}
输出:test2
(3)
var x = Boolean(false);
if (x) {console.log("test1")
}else {console.log("test2")
}
输出:test2
(4)
var x = false;
if (x) {console.log("test1")
}else {console.log("test2")
}
输出:test2
(5)
var x = new Boolean(false);
if (x) {console.log("test1")
}else {console.log("test2")
}
输出:test1
综上:任何值不为undefined或者null的对象, 包括值为false的Boolean对象, 在条件语句中,其值都将作为true来判断。
3.4 Object
对象是JavaScript中重要的数据类型,除数字、true、false、null、undefined和字符串外,所有的值都是对象。在JavaScript中对象是一组无序的键值对集合,类似其它语言的HashMap、Dictionary等数据结构。下面会有单独一小节来专门讲述下对象。
3.5 undefined
在使用var声明变量但未对其初始化时,该变量的值即为:undefined。undefined类型也只有这一个值。
字面值undefined主要用于比较。
var i = undefined;
console.log(i == undefined); // true
未初始化的变量与未声明的变量
var foo;
console.log(foo); // undefined
console.log(bar); // 报错
var foo;
console.log(typeof(foo)); // undefined
console.log(typeof(bar)); // undefined
使用typeof操作符来检测未初始化的变量与未声明的变量,都返回undefined。
3.6 null
与undefined类似,null类型也只有一个值null。空值null表示一个空的对象指针。
console.log(typeof(null)); // object
null与undefined比较:
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaNconsole.log(isNaN(1 + null)); // false
console.log(isNaN(1 + undefined)); // trueconsole.log(null === undefined); // false
console.log(null == undefined); // true
3.7 typeof、instanceof与Object.prototype.toString
由于JavaScript是动态类型的,因此就需要一种手段来检测给定的变量的具体数据类型。
(1)typeof
typeof操作符返回的值是以下某个字符串:
- "undefined"
- "boolean"
- "string"
- "number"
- "object"
- "function"
console.log(typeof(123)); // number
console.log(typeof("123")); // string
console.log(typeof(NaN)); // number
console.log(typeof(Infinity)); // number
console.log(typeof(false)); // boolean
console.log(typeof(null)); // object
console.log(typeof([])); // object
console.log(typeof({})); // object
console.log(typeof(function(){})); // function
console.log(typeof(undefined)); // undefined
(2)instanceof:下文会讨论。
(3)Object.prototype.toString:下文会讨论。
4、流程控制与运算符
4.1 流程控制
流程控制主要有条件语句和循环语句。条件语句又分为:if语句,if-else语句,switch语句等。循环语句分为:while循环,for循环,do-while循环。
4.1.1 条件语句
(1)if语句
if (condition1) {statement1;
}else if(condition2) {statement2;
}else {statement3;
}
该结构,当条件1(condition1为true)满足时,执行语句1(statement1),否则条件2(condition2为true)满足时,执行语句2,以上都不满足则执行语句3(statement3)。
这里的else if
可以有零个或多个,甚至else
都是可选的,根据实际情况来做实际判断。
if (i > 0) {console.log("i大于0");
}else if(i < 0) {console.log("i小于0");
}else {console.log("i等于0");
}
(2)switch语句
switch是一种多分支结构,与if结构类似,也是一种普遍使用的流程控制语句。
switch(expression) {case value1:statement1;break;case value2:statement2;break;default:statement3;
}
当表达式(expression)的值,等于对应case的值(value),则会执行对应的语句块(statement),break用于跳出该switch结构,若省略break,则会继续执行下一个case。default用于以上表达式的值都不满足条件。
表达式(expression)可以使用任何数据类型,包括字符串、对象。case的值(value)也可以是变量、表达式,不一定是常量。这点与其他有的语言不同,只能使用数值。
4.1.2 循环语句
(1)while语句
while循环包含循环条件和循环体,当循环条件满足条件时,才会执行循环体内的代码块。
while(expression) {statement;
}
while(i < 100) {i++;
}
(2)for语句
for语句一般包含初始条件、循环条件、循环递增(递减)语句三部分。
for(initialization; expression; post-loop-expression) {statement;
}
for(var i = 0; i < 100; i++) {console.log(i);
}
(3)for-in语句
该语句类似于其他语言的foreach语句,可以用了遍历容器结构或对象的属性。
for (property in expression) {statement;
}
var o = [1, 2, 3];
for(var i in o) {console.log(o[i]);
}
(4)do-while语句
do-while语句与while语句类似,不同的时,do-while语句会先执行循环体,再检测循环条件,这就意味着该循环语句至少会执行一次。
do {statement;
}while(expression);
(5)break与continue
break和continue都可用于控制循环中代码的执行。
break:立即退出循环。
continue:跳出当前循环,继续执行下次循环。
4.2 运算符
JavaScript中运算符大体可分为,算术运算符、关系运算符、逻辑运算符以、位运算符以及其它操作符等,当然也包括运算符重载。
- 算术运算符:
+
,-
,*
,/
,%
,++
,--
,+=
,-=
,*=
,/=
,%=
等。 - 关系运算符:
<
,>
,<=
,>=
,==
,===
,!=
,!==
。 - 逻辑运算符:
&&
,||
,!
- 位运算符:
~
,&
,|
,^
,<<
,>>
,>>>
- 其他操作符:
=
,,
,?=
4.2.1 算术运算符
(1)加法操作符(+)
加减法操作符时JavaScript中最常用得操作符之一,与其他语言不同得是,在JavaScript中有一系列特殊得行为,使用时应当注意。
console.log(1 + 2); // 3
console.log(1 + "2"); // 12
console.log("1" + "2"); // 12
console.log(1 + [2]); // 12
console.log(1 + "2" + 3); // 123
console.log("1" + 2 + 3); // 123
console.log(1 + 2 + "3"); // 33
console.log("1" + 2 + "3"); // 123
console.log(1 + [2, 3]); // 12,3
console.log(1 + ""); // 1
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.05 + 0.25); // 0.3// boolean
console.log(1 + true); // 2
console.log(1 + false); // 1// string
console.log("AlphaGL:" + null); // AlphaGL:null
console.log("AlphaGL:" + undefined); // AlphaGL:undefined
console.log("AlphaGL:" + Infinity); // AlphaGL:Infinity
console.log("AlphaGL:" + NaN); // AlphaGL:NaN
console.log("AlphaGL:" + false); // AlphaGL:false
console.log("AlphaGL:" + true); // AlphaGL:true// infinity
console.log(1 + Infinity); // Infinity
console.log(Infinity + Infinity); // Infinity
console.log(1 + (-Infinity)); // -Infinity
console.log((-Infinity) + (-Infinity)); // -Infinity
console.log(Infinity + (-Infinity)); // NaN// 0
console.log((+0) + (+0)); // 0
console.log((-0) + (-0)); // -0
console.log(0 + (-0)); // 0// NaN
console.log(1 + NaN); // NaNconsole.log(1 + null); // 1
console.log(1 + undefined); // NaN
console.log(1 + (new Date())); // 1Mon May 25 2017 17:09:08 GMT+0800 (中国标准时间)
console.log(1 + {name: "AlphaGL"}); // 1[object Object]
综上,使用加法操作符可以总结为如下规则:
- 如果两个操作数都是数值,则执行常规得加法计算。这里需要注意浮点数的加法。
- 如果一个操作数为字符串,则将另外一个操作数也转化成字符串类型,再执行字符串的拼接。
- 如果一个操作数是数值,另外一个操作是Infinity,则加法结果为Infinity。如果一个操作数是数值,另外一个操作数是-Infinity,则加法结果为-Infinity。如果是Infinity加-Infinity,则加法结果为NaN。如果一个操作数是数值,另外一个操作数是NaN,则加法结果为NaN。
- 如果一个操作数是数值,另外一个操作数是boolean,null类型,则先将boolean和null类型转行成原始值,再执行加法运算。
- 如果一个操作数是数值,另外一个操作数是对象,则会先调用对象的
valueOf
方法转化成原始值,如果对象没有valueOf
方法,则调用toString
方法。
(2)减法运算符(-)
减法的运算规则与加法类似,这里就不再详细介绍了。
(3)乘法运算符(*)
console.log(2 * 3); // 6
console.log(-2 * -3); // 6
console.log(2 * -3); // -6
console.log(2 * Number.MAX_VALUE); // Infinity
console.log(-2 * Number.MAX_VALUE); // -Infinity
// NaN
console.log(2 * NaN); // NaN
console.log(-2 * NaN); // NaN
console.log(0 * NaN); // NaN
console.log(NaN * NaN); // NaN
// Infinity
console.log(2 * Infinity); // Infinity
console.log(-2 * Infinity); // -Infinity
console.log(-2 * -Infinity); // Infinity
console.log(0 * Infinity); // NaN
console.log(Infinity * Infinity); // Infinity
console.log(-Infinity * -Infinity); // Infinity
// undefined
console.log(2 * undefined); // NaN
console.log(0 * undefined); // NaN
console.log(undefined * undefined); // NaN
// boolean
console.log(2 * false); // 0
console.log(2 * true); // 2console.log(2 * "34"); // 68
console.log(2 * "AlphaGL"); // NaN
console.log(2 * [3, 4]); // NaN
console.log(2 * {name:"34"}); // NaN
console.log(2 * new Date()); // 2992421935692
综上,使用减法操作符可以总结为如下规则:
- 两个正数或两个负数相乘,结果为正数。其它有一个操作数为负数,那结果也为负数。如果结果超出数值的表示范围,则结果为Infinity或-Infinity。
- 如果有一个操作数为NaN或undefined,则结果为NaN。
- 如果一个非0数值与Infinity或-Infinity相乘,则结果为Infinity或-Infinity,符号取决于操作数的符号和Infinity还是-Infinity。0与Infinity或-Infinity,则结果为NaN。
- 如果一个操作数是数值,另外一个操作数是boolean或者字符串,则先将该操作数转化为原始值,如果转化后的值不是数值,则结果为NaN,否则执行常规乘法运算。
- 如果一个操作数是数值,另外一个操作数是对象,则结果为NaN。如果是Date对象,则乘以基于当前到1970年1月1日起的毫米数。
(4)除法操作数(/)
除法的运算规则与乘法类似,同样,这里就不再详细介绍了。
(5)模(求余)运算(%)
该运算符是求得除法运算后的余数。
console.log(10 % 3); // 1
console.log(-10 % 3); // -1
console.log(10 % -3); // 1console.log(10 % 3.14); // 0.5799999999999996
综上,模运算规则如下:
- 模运算的结果的符号,与第一个操作数相同。模运算用于浮点数时,结果会有误差。
(6)自增(++)与自减(--)
自增和自减有分为前置和后置。
var x = 5;
var y = ++x - 2
/* 等价于
* var x = 5;
* x = x + 1;
* var y = x - 2;
*/console.log(x); // 6
console.log(y); // 4
var x = 5;
var y = x++ - 2;
/* 等价于
* var x = 5;
* var y = x - 2;
* x = x + 1;
*/console.log(x); // 6
console.log(y); // 3
前置自增与后置自增的区别是,前置自增先执行自增,再执行后续的运算,后置自增是先执行运算,再执行自增。同理,自减原理也一样,就不在赘述了。
(7)x op= y操作
这里把+=
,-=
,*=
,/=
,%=
等复合运算统称为op=
,那么:
x op= y
大多数情况下等价于:
x = x op y
其中,下面这个表达式中x计算了两次,在x含有副作用的表达式时,二者就不等价了。
var c = [1, 2, 3];
var i = 0;
c[i++] *= 2;
console.log(c)
// [ 2, 2, 3 ]var d = [1, 2, 3];
var j = 0;
d[j++] = d[j++] * 2;
console.log(d);
// [ 4, 2, 3 ]
4.2.2 关系运算符
用来判断一个操作数是否大于或小于或等于另外一个操作数。
console.log(2 < 3); // true
console.log("12" < 3); // false
console.log("12" < "3"); // true
console.log("Alpha" < "alpha"); // true
console.log("AlphaGL" < "AlphagL"); // true
console.log(2 < "AlphaGL"); // false
console.log(2 < true); // false
console.log(2 < undefined); // false
console.log(2 < null); // false
console.log(2 < NaN); // false
console.log(false < true); // true
console.log(2 < Infinity); // true
console.log(2 < -Infinity); // false
console.log(Infinity < Infinity); // false
console.log(Infinity < Infinity + 1); // false
console.log(0 <= 0); // true
console.log(0 >= 0); // true
console.log(12 == "12"); // true
console.log(12 === "12"); // false
console.log(12 !== "12"); // true
console.log(undefined == 0); // false
console.log(undefined == null); // true
console.log(undefined == false); // false
console.log(null == false); // false
console.log(null == 0); // false
console.log("" == 0); // true
console.log(undefined == ""); // false
console.log(2 != NaN); // true
console.log(NaN == NaN); // false
console.log(NaN != NaN); // true
console.log(false == 0); // true
console.log(true == 1); // true
综上,关系运算符返回的都是boolean值,有以下规则:
- 如果比较的两个操作数都是数值,则执行数值比较。如果只有一个操作数是数值,则将另外一个操作数转换为数值,再执行数值比较。
- 如果比较的两个操作数都是字符串,则依次比较字符串每个字符的Unicode值。
- 如果有一个操作数是NaN,则执行结果为false,执行不相等操作时,执行结果为true。
- null和undefined相等。但不能将null和undefined转化为其它任何值。
- 如果有一个操作数是对象,另外一个操作数不是,则会调用对象的valueOf方法得到原始值,再应用上面的规则。
- 当两个操作数的值相同,类型也相同,并且都不是NaN时,则两个操作数全等(===)。当比较的两个操作数转换为相同类型后的值相等,则两个操作数相等(==)。
4.2.3 逻辑运算符
(1)逻辑与(&&)
在boolean环境下当逻辑与的两个操作数同时为true时,结果才为true,否则为false。
console.log(new Date() && 2); // 2
console.log(2 && new Date()); // 2017-05-31T02:39:51.033Z
console.log(false && new Date()); // false
console.log(new Date() && new Date()); // 2017-05-31T02:39:51.035Z
console.log(false && 0); // false
console.log(true && 0); // 0
console.log(2 && 0); // 0
console.log(2 && ""); // ""
console.log(2 && "AlphaGL"); // AlphaGL
console.log(2 && null); // null
console.log(2 && undefined); // undefined
console.log(2 && NaN); // NaN
console.log(2 && Infinity); // Infinity
综上,逻辑与的使用规则可以总结如下:
- 如果第一个操作数能转换成false,则返回第一个操作数,否则返回第二个操作数。在boolean环境中使用时,两个操作数结果都为true时,返回true,否则返回false。
- 能够转换为false的值有,0,"",null,undefined。
短路操作:
在执行逻辑与操作时,当第一个操作数的结果为false时,就不在执行第二个操作数的求值了。因为无论第二个操作数为何值,其结果都不可能为true。
function test(i) {if(i > 0) {return i;}else{return -i;}
}console.log(false && test(2)); // false
console.log(true && test(2)); // 2
(2)逻辑或(||)
在boolean环境下当逻辑或的两个操作数任意一个为true时,结果都为true。一般,可用来给变量设置默认值。
console.log(new Date() || 2); // 2017-05-31T02:46:51.732Z
console.log(2 || new Date()); // 2
console.log(false || new Date()); // 2017-05-31T02:48:51.732Z
console.log(new Date() || new Date()); // 2017-05-31T02:48:51.732Z
console.log(false || 0); // 0
console.log(true || 0); // true
console.log(2 || 0); // 2
console.log(2 || ""); // 2
console.log(2 || "AlphaGL"); // 2
console.log(2 || null); // 2
console.log(2 || undefined); // 2
console.log(2 || NaN); // 2
console.log(2 || Infinity); // 2
综上,逻辑或的使用规则可以总结如下:
- 如果第一个操作数能转换成true,则返回第一个操作数,否则返回第二个操作数。在boolean环境中使用时,两个操作数任意一个为true时,返回true,否则返回false。
- 能够转换为false的值有,0,"",null,undefined。
短路操作:
在执行逻辑或操作时,当第一个操作数的结果为true时,就不在执行第二个操作数的求值了。因为无论第二个操作数为何值,其结果都不可能为false。
function test(i) {if(i > 0) {return i;}else{return -i;}
}console.log(false || test(2)); // 2
console.log(true || test(2)); // true
(3)逻辑非(!)
无论操作数是什么类型的数据,该操作都会返回一个boolean。逻辑非会先将操作数转换为一个boolean,再对齐求反。
console.log(!0); // true
console.log(!""); // true
console.log(!NaN); // true
console.log(!null); // true
console.log(!undefined); // true
console.log(!Infinity); // false
console.log(!2); // false
console.log(!"AlphaGL"); // false
console.log(!new Date()); // false
综上,逻辑非的使用规则可以总结如下:
- 如果操作数能转换为true的话,则返回false,否则返回false。
- 能够转换为false的值有,0,"",null,undefined。
4.2.4 位运算符
位运算是比较低层次的运算,按内存中表示数值的位来操作数值。JavaScript中所有的数值都是以64位格式存储,而位操作符是先将64位的值转换成32位的整数,然后执行操作,最后再将结果转换回64位。
对于有符号的整数,32中的前31位表示整数的值,第32位表示数值的符号,用0表示整数,1表示负数,因此第32位也叫符号位。其中,正数是以二进制格式存储的,负数二进制补码的形式存储的。
(1)原码、反码和补码
原码,是该数值的符号位与绝对值的二进制表示。例如:
2[原码]: 0000 0000 0000 0000 0000 0000 0000 0010
-2[原码]: 1000 0000 0000 0000 0000 0000 0000 0010
反码,正数的反码是其原码。负数的反码,是符号位不变,其余各位取反,即1变成0,0变成1。例如:
2[反码]: 0000 0000 0000 0000 0000 0000 0000 0010
-2[反码]:1111 1111 1111 1111 1111 1111 1111 1101
补码,正数的补码是其原码。负数的补码,是其反码加1。例如:
2[补码]: 0000 0000 0000 0000 0000 0000 0000 0010
-2[补码]:1111 1111 1111 1111 1111 1111 1111 1110
(2)按位与(&)
按位于,是将两个操作数的二进制位对齐,当两个数值的位都为1时,结果为1,任意一个为0,则结果为0。
console.log(3 & 5); // 13 = 0000 0000 0000 0000 0000 0000 0000 0011
5 = 0000 0000 0000 0000 0000 0000 0000 0101
& = 0000 0000 0000 0000 0000 0000 0000 0001
(3)按位或(|)
按位或,是将两个操作数的二进制位对齐,当两个数值的位任意一个为1时,结果为1,两个都为0,则结果为0。
console.log(3 | 5); // 73 = 0000 0000 0000 0000 0000 0000 0000 0011
5 = 0000 0000 0000 0000 0000 0000 0000 0101
| = 0000 0000 0000 0000 0000 0000 0000 0111
(4)按位非(~)
按位非,是得到该数值的反码。
console.log(~3); // -43 = 0000 0000 0000 0000 0000 0000 0000 0011
~ = 1111 1111 1111 1111 1111 1111 1111 1100
(5)按位异或(^)
按位异或,是将两个操作数的二进制位对齐,当两个数值的位其中只有一个为1时,结果为1,两个都为0或都为1,则结果为0。
console.log(3 ^ 5); // 63 = 0000 0000 0000 0000 0000 0000 0000 0011
5 = 0000 0000 0000 0000 0000 0000 0000 0101
^ = 0000 0000 0000 0000 0000 0000 0000 0110
(6)左移(<<)
左移,是将操作数的所有位移动指定的位数,右侧多出的位用0填充。左移不影响操作数的符号位。
console.log(3 << 2); // 12
console.log(-3 << 2); // -123 = 0000 0000 0000 0000 0000 0000 0000 0011
<< 2 = 0000 0000 0000 0000 0000 0000 0000 1100
(7)有符号右移(>>)
有符号右移,是将操作数的所有位移动指定的位数,并保留符号位。左侧多出的位用0填充。
console.log(12 >> 2); // 3
console.log(-12 >> 2); // -312 = 0000 0000 0000 0000 0000 0000 0000 1100
>> 2 = 0000 0000 0000 0000 0000 0000 0000 0011
(8)无符号右移(>>>)
无符号右移,是将操作数的所有位移动指定的位数。对于正数,无符号右移与有符号右移结果相同,负数会以补码的形式右移指定的位。
console.log(12 >>> 2); // 3
console.log(-12 >>> 2); // 1073741821
4.2.5 其它运算符
(1)赋值运算符(=)
赋值可以和其他运算符组合使用。例如:
var x = 3;
console.log(x += 5); // 8
(2)逗号运算符(,)
逗号运算符,可以再一条语句中执行多个操作。如果,逗号运算符用于赋值,则返回表达式中的最后一项。
var x = 2, y = 3, z = 5;var pos = (2, 3, 5);
console.log(z); // 5
console.log(pos); // 5
(3)三目运算符(?=)
三目运算符,格式形如:
variable = boolean_expression ? true_value : false_value
当表达式boolean_expression的值位true时,则返回true_value的值,否则,返回false_value的值。
console.log(1 > 2 ? 1 + 2 : 1 - 2); // -1
5、对象
在介绍数据类型的时候提到过,在JavaScript中对象是一组无序的键值对集合,类似其它语言的HashMap、Dictionary等数据结构。除数字、true、false、null、undefined和字符串外,所有的值都是对象。JavaScript内置了Object、Date、Array、Function、RegExp等对象。所有对象继承Object对象。
5.1 对象的创建
对象的创建分为两种方式:
(1)使用new操作符,后面紧跟构造函数
var student = new Object(); // 等价于 var student = {};
student.name = "AlphaGL";
student.age = 18;
student.print = function () {console.log("hello AlphaGL");
}
(2)使用对象字面量表示法。由若干名/值对中间用冒号分割,每对名/值对间用逗号分隔组成的映射表。
var student = {name : "AlphaGL",age : 18print: function () {console.log("hello AlphaGL");},
};
5.2 读取属性
可以通过点(.)或者中括号([])的方式获取对象属性的值。
(1)通过点(.)来获取
var student = {name : "AlphaGL",age : 18
};console.log("name = " + student.name); // name = AlphaGL
(2)通过中括号访问属性的值,中括号内可以是变量且计算结果必须是字符串的表达式。如果属性名包含回导致语法错误的字符,或者属性名使用的是关键字或者保留字,也可以使用中括号表示。
var name = "nick name";
student[name] = "AlphaGL"; // 等价于 student["nick name"] = "AlphaGL";
一般推荐使用点的方式去获取对象属性。
5.3 检测属性
(1)hasOwnProperty()方法可以检测给定属性存在于对象实例中时,则返回true。
function Student() {}Student.prototype.work = "game";var stu = new Student();
stu.name = "AlphaGL";
stu.age = 18;console.log(stu.hasOwnProperty("name")); // true
console.log(stu.hasOwnProperty("work")) // false
(2)in操作符会访问对象的给定属性,无论该属性是存在于实例中还是原型中都返回true。
function Student() {}Student.prototype.work = "game";var stu = new Student();
stu.name = "AlphaGL";
stu.age = 18;console.log("name" in stu); // true
console.log("work" in stu) // true
5.4 删除属性
delete运算符可以用来删除对象的自有属性,不会删除原型的同名属性,删除不存在的属性在对象上,delete将不会起作用,但仍会返回true。成功删除的时候会返回true,否则返回false。
function Student() {};Student.prototype.name = "hello";var stu = new Student();
stu.name = "AlphaGL";
stu.age = 18;console.log(delete stu.name); // true
console.log(delete stu.name); // 什么不做,同样返回true
console.log(stu.name); // hello
5.5 Array对象
JavaScript中,数组算是最常用的类型。数组的大小可以动态调整,每一项可以保存任何类型的数据,起始项从0开始。还可以实现堆栈,队列等数据结构。
(1)数组的创建
使用Array构造函数创建。
var nums = new Aarray(3);var names = new Array("foo", "bar")var colors = Array("R", "G", "B")
使用数组字面量表示法。即使用中括号,并将每个元素用逗号隔开。
var num = [1, 2, 3];var names = ["foo", "bar"];var params = [1.2, "ab", true];var pos = [{x:1, y:2}, {x:3, y:4}];
(2)数组元素的访问。
var a = ["AlphaGL", 18, true];
console.log(a[0]); // AlphaGL
console.log(a[1]); // 18
console.log(a[2]); // true
//indexOf返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。类似的还有lastIndexOf方法。
console.log(a.indexOf("AlphaGL")); // 0
console.log(a.indexOf(true)); // 2
console.log(a.indexOf(18)); // 1
console.log(a.indexOf(2)); // -1console.log(a.length); // 3
console.log(a[3]); // undefined。javascript数组下标从0开始。
可以使用负数或非整数来索引数组。这时,数值将会转换为字符串,而该索引被当作对象的常规属性。如果,使用了非负整数的字符串,则它会被当作数组索引访问,而不是对象属性访问。
var a = ["AlphaGL", 18, true];
console.log(a[-1]); // undefined
console.log(a[1.5]); // undefinedconsole.log(a["1"]); // 18
console.log(a["2"]); // true
由此可知,数组的访问只是对象访问的一种特殊形式,当访问不存在的属性时,javascript也不会报错,只会返回undefined值。因此,javascript中数组不存在数组越界的问题。
(3)数组元素的添加与删除
添加元素:
var a = [];
a[0] = "AlphaGL";
a.push(18, true);console.log(a); // [ 'AlphaGL', 18, true ]
删除元素:
var a = ["AlphaGL", 18, true];
delete a[1];
console.log(a[1]); // undefined
console.log(a.length); // 3
console.log(a.pop()); // true。从数组中删除最后一个元素,并返回该元素的值
console.log(a.length); // 2
console.log(a.shift()) // AlphaGL。从数组中删除第一个元素,并返回该元素的值
console.log(a.length); // 1
a[0] = undefined;
console.log(a.length); // 1
var a = ["AlphaGL", 18, true];
a.length = 2;
console.log(a[2]); // undefined
a.length = 0;
console.log(a[0]); // undefined
var a = ["AlphaGL", 18, true];
a.splice(2, 0, "haha"); // 从第2个元素开始,删除0个元素,即添加元素haha
console.log(a); // [ 'AlphaGL', 18, 'haha', true ]a.splice(1, 2); // 从第1个元素开始,删除2个元素。
console.log(a); // [ 'AlphaGL', true ]a.splice(0, 1, "haha"); // 从第0个元素开始,删除1个元素,并添加haha元素。
console.log(a); // [ 'haha', true ]
注:删除数组元素与将数组元素赋值为undefined值类似。使用delete不是修改数组的length属性,也不会移动后继元素位置。其它操作方法基本都会移动数组元素和改变数组length值。也可以直接操作数组的length属性来达到输出元素的目的。push和pop方法提供了类似栈结构的操作。push和shift方法则提供了类似队列结构的操作。splice有替换数组中任意数量的项的作用。
(4)数组的检测
var a = ["AlphaGL", 18, true];
console.log(Array.isArray(a)); // true
console.log(a instanceof Array); // true
注:当存在两个以上的全局执行环境时,即存在两个以上不同版本的Array构造函数,instanceof则只能在单一的全局执行环境有效。
(5)数组的排序
var a = [1, 11, 57, 7, 23];
a.sort(function (p1, p2) { // 使用比较函数来对数组元素进行排序。返回的值小于0,则p1放到p2位置之前;大于0则p1在p2之后;等于0则位置不变。return p1 > p2;
});console.log(a); // [ 1, 7, 11, 23, 57 ]
var a = ["AlphaGL", 18, true];
a.reverse(); // 逆序数组。
console.log(a); // [ true, 18, 'AlphaGL' ]
(6)数组的遍历与迭代
var a = [1, 11, 57, 7, 23];
var t1 = a.every(function (element, index, array) {return element % 2 != 0;
});var t2 = a.every(function (element, index, array) {return element > 10;
});console.log(t1); // true
console.log(t2); // false
注:every方法会对数组中的每一项运行给定函数,如果该函数的每一项都返回true,则结果才为true。
var a = [1, 11, 57, 7, 23];
var t1 = a.filter(function (element, index, array) {return element % 2 != 0;
});var t2 = a.filter(function (element, index, array) {return element > 10;
});console.log(t1); // [ 1, 11, 57, 7, 23 ]
console.log(t2); // [ 11, 57, 23 ]
注:filter方法会对数组中的每一项运行给定的函数,并返回该函数会返回为true的项组成的新数组。
var a = [1, 11, 57, 7, 23];
var t1 = a.forEach(function (element, index, array) {array[index] = element + 1;
});
console.log(a); // [ 2, 12, 58, 8, 24 ]
注:forEach方法同样会对数组中每一项运行给定的函数。该方法没有返回值。
var a = [1, 11, 57, 7, 23];
var t1 = a.map(function (element, index, array) {if(element > 10) {return element + 1;}return element - 1;
});console.log(t1); // [ 0, 12, 58, 6, 24 ]
注:map方法会将每次运行给定的函数返回的值,组成一个新的数组。
var a = [1, 11, 57, 7, 23];
var t1 = a.some(function (element, index, array) {return element > 50;
});console.log(t1); // true
注:map方法同样会对数组中的每一项都运行给定的函数,如果该函数的任一项结果为true,则返回true。
(7)其它
当然,数组还有一些其它的用法和函数。这里就不一一介绍了。感兴趣的,可以参考文末列举的参考链接。
6、函数
函数,简单描述就是可重复调用多次的功能模块。在JavaScript中,每个函数都是Function类型的实例,因此也一样具有属性和方法。函数名也是对象,可以把函数当作值来使用,这样就提供极大的灵活性。
6.1 函数的定义
在JavaScript中,函数的定义有如下几种实现方式:
(1)function关键字+函数名+参数列表+花括号构成的语句块,例如:
function foo(p1, p2) {return p1 + p2;
}console.log(typeof(foo)); // function
console.log(foo(3, 4)); // 7
(2)使用Function构造函数。一般,不推荐这种使用方法。
var foo = new Function("p1", "p2", "return p1 + p2");console.log(foo(3, 4)); // 7
(3)函数表达式
// 声明了一个匿名函数,并赋值给foo变量。
var foo = function(p1, p2) {return p1 + p2;
}console.log(foo(3, 4)); // 7// 函数表达式也可以包含名称
var bar = function sum(p) {if(p <= 1) {return 1;}else {return p + sum(p - 1);}
}console.log(bar(5)); // 15// 声明即调用
var sum = function(p1, p2) {return p1 + p2;
}(3, 4);console.log(sum); // 7
6.2 函数的参数与内部属性
JavaScript中函数定义并未指定函数参数的类型,调用时也未对实参的值做类型检查,同样也不检查参数个数。
6.2.1 函数的参数
function foo(p1, p2, p3) {return p2;
}console.log(foo(1)); // undefined
console.log(foo(1, 2)); // 2
console.log(foo(1, 2, 3)); // 2
console.log(foo(1, 2, 3, 4)); // 2
当形参与实参的个数不匹配时,少的参数将被置为undefined,多的参数将被丢弃。
6.2.2 函数的内部属性
在函数内部,有个特殊的对象arguments。该对象用来保存函数参数,可以像数组样使用数字索引来访问参数,同样它也包含length属性。但它并不是真正的数组。另外,该对象还包含callee属性,该属性指向拥有这个arguments对象的函数。
function foo(p1, p2, p3) {console.log(arguments.length); // 3console.log(arguments[0]); // 第一个参数,即:1console.log(arguments[1]); // 第二个参数,即:2console.log(arguments[2]); // 第三个参数,即:3
}foo(1, 2, 3);
使用arguments和callee:
function sum(p) {if (p <= 1) {return 1;}else {return p + arguments.callee(p -1);}
}console.log(sum(5)); // 15
6.3 函数的属性
前面提到过,每个函数都是Function类型的实例,因此也一样具有属性和方法。函数有以下比较常用的属性。
function foo(p1, p2 , p3) {console.log(arguments.length);console.log(arguments.callee.length);
}console.log(foo.name); // foo
console.log(foo.length); // 3
foo(1, 2); // 2 3
由上可知:
foo.name:函数的名称。
foo.length:形参的个数。
arguments.length:实参的个数。
arguments.callee.length:形参的个数。
6.4 闭包
闭包(closure)是函数型语言的一个重要的特性,许多高级特性都依赖闭包来实现。闭包,是创建在一个函数内部的函数,能够访问函数内部的变量,并保存在内存中,记录上次运行的结果,即保存了创建时的上下文环境信息。因此,可以简单总结为:
闭包=函数内部创建的函数 + 该函数创建时的上下文环境信息
例如:
function counter() {var count = 0;return function() {return count++;}
}var foo = counter();
console.log(foo()); // 0
console.log(foo()); // 1
console.log(foo()); // 2
闭包的这种机制,就实现面向对象的封装提供了支持。将私有变量封装在内部,提供外包接口函数,来访问该变量。
构造函数
函数内部属性
函数的作用域
reduce
7、面向对象
前面提到过,JavaScript中所有的都是对象。在面向对象编程中,对象是类的实例,而类是具有相同属性和行为的一类对象的抽象和集合。例如:狮子对象是动物这一类型中的一个实例。面向对象编程有三大特性:封装,继承和多态。
7.1 构造函数
前面提到过,使用new关键字调用构造函数可以创建一个新对象。
function Student(name, age) {this.name = name;this.age = age;this.setName = function(n) {this.name = n;}this.getName = function() {return this.name;}
}var student = new Student("张三", 18);
student.setName("李四");console.log(student.getName()); // 李四
其中,this关键字指向了,当前要创建的对象。
7.2 原型与继承
每个对象都有一个私有属性(prototype)原型,该属性指向该对象的原型对象。可以理解为其他编程语言中的,指向基类或者父类的作用。当然,该原型对象同样有一个自己的prototype,层层向上直到该对象的原型为null。null没有原型。JavaScript中几乎所有的对象都是位于原型链顶端的Object的实例,同样可以理解为,都是Object的子类。因此,使用原型对象可以让所有对象实例共享它所包含的属性和方法。
7.2.1 原型的使用
function Student(name, age) {this.name = name;this.age = age;this.getName = function() {return this.name;}
}var student1 = new Student("张三", 18);
var student2 = new Student("李四", 18);console.log(student1.getName == student2.getName); // false
上面,创建两个不同的对象实例,getName实现了相同的功能,却每个对象中都保留了一份,造成不必要的浪费。这就需要通过原型prototype来解决此问题了。
function Student(name, age) {this.name = name;this.age = age;Student.prototype.getName = function() {return this.name;}
}Student.prototype.country = "china";var student1 = new Student("张三", 18);
var student2 = new Student("李四", 18);console.log(student1.getName == student2.getName); // true
console.log(student1.country); // china
console.log(student2.country); // china
7.2.2 访问属性规则
function A() {}A.prototype.name = "小明";
A.prototype.age = 18;
A.prototype.country = "china";function B() {
}B.prototype = new A();
B.prototype.name = "小李";
B.prototype.age = 20;function C() {}C.prototype = new B();
var c = new C();
c.name = "小赵";
c.country = "shanghai";console.log(c.country); // shanghai
console.log(c.age); // 20
console.log(c.name); // 小赵
当访问对象的某个属性时,会根据给定的属性名称来查找。如果,在该对象的实例中找到该属性,则返回属性的值;否则,则继续查找该对象的原型对象,在原型对象中查找该属性,依次层层向上搜索,直到搜索到原型链的末尾。因此,对象的属性会覆盖同名的该对象的原型对象的同名属性。
7.2.3 isPrototypeOf与instanceof
function A() {
}function B() {
}var a1 = new A();
console.log(a1 instanceof A); // true
console.log(a1 instanceof B); // false
console.log(A.prototype.isPrototypeOf(a1)); // true
console.log(B.prototype.isPrototypeOf(a1)); // falseA.prototype = {};
var a2 = new A();
console.log(a1 instanceof A); // false
console.log(a2 instanceof A); // true
console.log(A.prototype.isPrototypeOf(a1)); // false
console.log(A.prototype.isPrototypeOf(a2)); // trueB.prototype = new A();
var a3 = new B();
console.log(a3 instanceof A); // true
console.log(a3 instanceof B); // true
console.log(B.prototype.isPrototypeOf(a3)); // true
console.log(A.prototype.isPrototypeOf(a3)); // true
通过以上实例可以总结如下:
object instanceof constructor
运算符,用来检测 constructor.prototype是否存在于参数object的原型链。虽然,右操作数是构造函数,但实际上检测了对象的继承关系,而不是检测创建对象的构造函数。prototypeObj.isPrototypeOf(object)
检查一个对象是否存在于另一个对象的原型链上。可以理解为object对象是否继承自prototypeObj.prototype。
参考:
MDN JavaScript教程
转载于:https://www.cnblogs.com/alphagl/p/7966664.html
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Javascript基础——数据类型
Javascript基础——数据类型数据类型学习要点typeof操作符Undefined类型Null类型Boolean类型Number类型string类型object类型数据类型学习要点 ECMAScript中有 5种简单数据类型: Undefined、 Null、 Boolean、 Number和 String。还有一种复杂数据类型——Object。 …...
2024/4/21 15:05:09 - 长沙割双眼皮顶尖艺星
...
2024/4/21 15:05:08 - 双眼皮需要医师资格证吗
...
2024/4/21 15:05:07 - 每周总结 2月22日
ngRoute与ui.router 由于放假之前看得视频教程,这次回来有点记不清楚了,就又重新跟着做了一下,结果发现了一个以前没注意到的问题。 遇到的问题: 这个main页面本来应该有一个table的,但是无论我怎么改,都是…...
2024/5/7 19:18:57 - WEB前端开发的思考与感悟
最近几年对于web前端的传闻很多,比如人才稀缺,简单易学,待遇丰厚,整体势头发展良好等等。遇到过一个不太熟搞后台开发的同事跑来问我学习前端需要掌握哪些内容,也听说过一个搞IOS开发准备自学前端半个月然后要去找前端…...
2024/5/7 19:38:43 - 十年未睡,呕心沥血写出来的TypeScript心得
内容偏长,建议先马后看概述重点问题内容概要强类型与弱类型静态类型与动态类型JS类型系统特征弱类型的问题强类型的优势TS语言规范与基本使用TS概述TS快速使用TS配置文件原始数据类型标准库声明中文错误消息作用域问题Object类型数组类型元组类型枚举类型函数类型任…...
2024/4/23 16:14:35 - 转正总结
到了十一月初终于是到了转正的时候啦 这三个月试用期期间,不仅修改和增加了大量的功能,还有增加了3个大的模块,算是做了一些实实在在的事情。 来这里发现其实很多都是组件化的东西,组件确实好用,所有的页面并不需要大量…...
2024/4/21 15:05:03 - 我做技术面试官的一些体会
作为一个一年多的前端工程师,之前的前端老大离职后,自己就扛起了一些前端方面的事务。面试当然是最具挑战的事情了,首先是筛选简历,接着是邀请到公司面对面聊。说说自己的体会吧。 筛选简历: 偏实习和经验较少的求职者…...
2024/4/21 15:05:02 - vue开发微信商城项目总结之六--关于vuex的思考
先对项目进行一下简单的介绍 vue开发微信商城项目总结之一–项目介绍 项目开发初期,由于项目比较着急上线,前端的框架在选型上比较仓促,只是因为vue学习成本较低,就选了它,没有什么别的原因, 之前看过angul…...
2024/4/21 15:05:01 - 一位老程序员的心得分享,WEB前端菜鸟,感觉很迷茫,该怎么做?
我们可以把学习路线比作游戏中的段位上分,在不同的分段都有自己的定位和要锻炼的事情: 1、青铜 - 从零开始小学生:怀着满腔的热血,看到了这一个行业的希望和未来,准备开始学习 Web 开发知识。 a. 先通过 w3cschool 等…...
2024/4/21 15:05:00 - 浅谈C++中句柄的使用
我想在此将我新学的句柄类做个小结,就我个人理解,C++句柄类的主要目的是在对象层面上实现多态。 比如: Class A { public: A(){} ~A(){} virtual void func(){printf("A";} }; Class B:public A { public: B(){} ~B(){} void func(){printf("B";} };假设…...
2024/4/21 15:04:59 - 初学前端小白,如何撕去菜鸟标签,这些学习经验绝对让你受益匪浅!
作为前端新人,我们常以菜鸟自居,主要是专业程度不高,还有就是自谦。其实,作为菜鸟的我们也想撕掉这类标签,我们也努力,可还是学不好前端,是真的不适合做这行还是方法不对,没人告诉我…...
2024/4/25 22:41:58 - 在ASP.NET Core MVC中搭建基于TypeScript的Angular2项目
这是本人的第一篇博客。 我是一名比较喜欢追求新技术的野生程序员,技术水平有限,只是想记录和分享一些个人心得体会,文章中若有不正确之处,请海涵! 前言 对于一个没有学过TypeScript,不了解ES5、Node.Js的初…...
2024/4/21 15:04:57 - 作为面试官之后的一些体会
作为一个一年多的前端,之前的前端老大离职后,自己就扛起了一些前端方面的事务。 面试当然是最具挑战的事情了,首先是筛选简历,接着是邀请到公司面对面聊。 说说自己的体会吧。 筛选简历: 偏实习和经验较少的求职者&…...
2024/4/25 16:57:42 - web前端开发学习总结-1
正式开始学习前端开发,以前就会写简单的html,js,现在回来一看,内容实在太丰富了,基本要从基础学起。 努力。。。努力。。。 学前端,首先要选个前端框架,VUE,Angular,Rea…...
2024/4/21 15:04:56 - 【21】总结一年来的前端学习心得
到今天,前端学习刚好满一年。我也顺利从机械狗变成一枚前端狗。对于前端学习,自己也是摸着石头过河,中间也有过困惑和迷茫。本文主要讲述自己一年来对于前端学习的心得体会,希望能对学习前端的人提供一些帮助。 前端主要分为三部…...
2024/4/21 15:04:54 - 三角形问题 -软件测试
UI版 : 三角形问题(JFrame界面) - 软件测试 一. 软件设计介绍 该软件以研究三角形问题为目的.通过用户选择三角形判断依据后,输入三角形的三条边长,通过相对应的功能判断出该三角形的类型.当用户完成本次操作后,会提示是否继续操作.若退出操作即结束该程序.二. 软件开发平台简介…...
2024/4/20 15:07:08 - LDAP ObjectClass 详解 (转)
初学LDAP时关于objectClass和Attribute之间的关系总是困扰着我,找过许多的中文资料都没有得到答案。最近终于彻底弄明白了这个问题,决定记录下来,以让后学者少走弯路。非常奇妙的是他们之间的关系与Java里面的一些概念很相似,接下来我会结合Java来讲讲LDAP中的objectClass与…...
2024/4/28 16:54:24 - 在线电影订票系统 - Vue学习心得
在最近电影订票系统的实现中,使用了Vue.js作为前端开发框架。 介绍 Vue是一个极简的Javascript MVVM框架。它容易上手,便于整合。而且,它对于Web组件化开发的思考和设计,使其完全能够为复杂的SPA(单页应用࿰…...
2024/5/5 9:04:52 - 上海切开双眼皮美莱保
...
2024/4/20 15:07:05
最新文章
- 深度学习之基于Matlab神经网络的活体人脸和视频人脸识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 人脸识别技术作为生物识别技术的一种,近年来得到了广泛的关注和应用。与传统的身份认证方…...
2024/5/7 19:48:53 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - IOS手机耗电量测试
1. 耗电量原始测试方法 1.1 方法原理: 根据iPhone手机右上角的电池百分比变化来计算耗电量。 1.2实际操作: 在iOS通用设置中打开电池百分比数值显示,然后操作30分钟,60分钟,90分钟,看开始时和结束时电池…...
2024/4/30 3:14:28 - composer常见错误解决
在Java中,常见的问题和解决方法包括: 内存不足错误:Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决,可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...
2024/5/5 8:38:08 - Go语言中如何实现继承
完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go语言中没有传统意义上的类和继承的概念,但可以通过嵌入类型(embedded types)来实现类似的功能。嵌入类型允许一个结构…...
2024/5/5 8:37:47 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/7 5:50:09 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57