52.3-JS标识符类型转换字符串和数值
清晨,是希望,是梦想,无论你此刻是否迷茫,在阳光升起的时候,请相信,努力的人最终都有回报,崭新的一天,愿你与美好不期而遇!早安!
总结:
- JS中没有除零异常;因为它有正负无穷;
1. 注释
普通注释
和C、Java一样
// 单行注释
/* 注释 */ 多行注释,也可以用在语句中
str = 'hello' + /*comment*/' magedu'
console.log(str)
Python
使用 # 作为单行注释,使用三引号""" """ 作为多行注释。
文件注释
文件注释位于文件的最前面,应包括文件的以下信息:概要说明及版本(必须),项目地址(开源组件必须),版权声明(必须)开源协议(开源必须),版本号(必须),修改时间(必须)。如果文件包含一些开源组件,则必须在文件注释中进行说明
/*!
* jRaiser 2 Javascript Library
* sizzle - v1.9.1 (2013-03-15T10:07:24+0800)
* http://jraiser.org/ | Released under MIT license
*
* Include sizzle (http://sizzlejs.com/)
*/
文档注释(JSDoc)
文档注释会以预定格式出现在API文档中,以“/”开头,其间每一行均以星号开头,(均与开始符的第一个星号对齐),且注释内容与“”间留一个空格
@module。声明模块
/**
* Core模块提供最基础,最核心的接口
* @module Core
*/
@class。声明类。必须搭配@constructor或@static使用,分别标记非静态与静态类
/**
* 节点集合类
* @class NodeList
* @constructor
* @param {ArrayLike<Element>} nodes 初始化节点
*/
@method。声明函数或类方法。
/**
* 方法说明
* @method 方法名
* @for 所属类名
* @param {参数类型} 参数名 参数说明
* @return {返回值类型} 返回值说明
*/
没有指定@for时,表示此函数为全局或模块顶层函数。参数有默认值时:
[参数名=默认值]
@example 示例注释,示例代码另起一行编写
/**
* @example
* multiply(3,2)
*/
@property。声明类属性
/*
* 属性说明
* @property {属性类型} 属性名
*/
2.常量和变量
标识符
标识符必须是字母、下划线、美元符号$和数字,但必须是字母、下划线、美元符号开头,依然是不能数字开头就行。 标识符区分大小写。
声明
var 声明一个变量 ,想起来再赋值都可以
let 声明一个块作用域中的局部变量(新语法)
const 声明一个常量(必须初始化赋值,不可以修改)
JS中的变量声明和初始化是可以分开的
a = 100 // (全局变量)现在不推荐,不严格;赋值之前不能引用;
var b = 200; // var定义,当前作用域提升此声明;
let c = 300; // ES6支持,声明
console.log(a,b,c)
#-------------------------------------------------------------------
100 200 300
Info: End process (上午8:57:14)
var a // 只是声明,a为undefined
let b
console.log(1,a,b)
function hello()
{
//var a
a = 100
}
hello() // 执行函数;
console.log(a) // a 全局突破函数 ,
#-------------------------------------------
var会把变量提升到当前全局或函数作用域。
常量和变量的选择
如果明确知道一个标识符定义后不再修改,应该尽量声明成const常量,减少被修改的风险,减少Bug。
3.数据类型
ES是动态语言,弱类型语言。
虽然先声明了变量,但是变量可以重新赋值任何类型。
// 类型转换 (隐式类型转换)
// 弱类型
console.log('====string====')
console.log(a = 3 + 'magedu',typeof(a))
console.log(a = null + 'magedu',typeof(a))
console.log(a = undefined + 'magedu',typeof(a))
console.log(a = true + 'magedu',typeof(a))
console.log('-----------------------------')
====string====
3magedu string
nullmagedu string
undefinedmagedu string
truemagedu string
// 数字
console.log('====number====')
console.log(a = null + 8,typeof(a))
console.log(a = undefined + 8,typeof(a)) // undefined 没法转换成一个对应的数字;NaN
console.log(a = true + 8,typeof(a)) // true = 1, false = 0
console.log(a = false + 8, typeof (a))
console.log('-----------------------------')
====number====
8 'number'
NaN 'number'
9 'number'
8 'number'
// boolean (当数字处理)
console.log('=====boolean=====')
console.log(a = null + true, typeof (a))
console.log(a = null + false, typeof (a))
console.log(a = undefined + true, typeof (a)) //undefined没法转换成一个对应的数字
console.log(a = undefined + false, typeof (a)) // NaN
console.log(a = null & true, typeof (a))
console.log(a = undefined & true, typeof (a))
console.log('-----------------------------')
=====boolean=====
1 'number'
0 'number'
NaN 'number'
NaN 'number'
0 'number'
0 'number'
// 短路
// && and || or
console.log(a = null && true, typeof (a)) // 逻辑运算符,null 直接就是false短路
console.log(a = false && null, typeof (a)) // 逻辑运算符,false短路返回false
console.log(a = false && 'magedu', typeof (a)) // boolean
console.log(a = true && 'magedu', typeof (a)) // 字符串
console.log(a = true && '', typeof (a)) // 字符串
console.log('-----------------------------')
null 'object'
false 'boolean'
false 'boolean'
magedu string
string
// null
console.log('=====null=====')
console.log(a = null + undefined, typeof (a)) // 0 + null
=====null=====
NaN 'number'
Info: End process (上午9:51:02)
弱类型,不需要强制类型转换,会隐式类型转换。
NaN,即Not a Number,转换数字失败。它和任何值都不等,和自己也不等,只能使用Number.isNaN(NaN)
总结:
遇到字符串,加号就是拼接字符串,所有非字符串隐式转换为字符串。
如果没有字符串,加号把其他所有类型都当数字处理,非数字类型隐式转换为数字。undefined特殊,因为它都没有定义值,所以转换数字失败得到一个特殊值NaN。
如果运算符是逻辑运算符,短路符,返回就是短路时的类型。没有隐式转换。
除非你十分明确,否则不要依赖隐式转换。写代码的时候,往往为了程序的健壮,请显式转换。
注意:以上的原则不要死记,忘了就实验,或者显示的类型转换
4. 字符串
将一个值使用' 单引号或者 " 双引号 引用起来就是字符串。
ES6提供了反引号定义一个字符串,可以支持多行,还支持插值。
let a = 'abc'
let b = "135"
let c = `line1
line2
line3
` // 支持多行
console.log(c)
#-----------------------------------------
line1
line2
line3
// 字符串插值,要求在反引号字符串中, python 3.6支持
let name = "tom", age = 19
console.log('Hi, my name = &{name}, I am &{age}')
5. 转义字符
JavaScript 定义反斜杠加上字符可以表示字符自身。注意,一些字符加上反斜杠后会表示特殊字符,而不是原字符本身,这些特殊转义字符被称为转义序列。
let school = 'magedu'
console.log(school.charAt(2)) // g 索引
console.log(school[2]) // g
console.log(school.toUpperCase()) // MAGEDU
console.log(school.concat('.com')) // 连接
console.log(school.slice(3)) // 切片,支持负索引
console.log(school.slice(3, 5))
console.log(school.slice(-2, -1))
console.log(school.slice(-2))
#--------------------------------------------------------------------------
g
g
MAGEDU
magedu.com
edu
ed
d
du
let url = "www.magedu.com"
console.log(url.split('.'))
console.log(url.substr(7, 2)) // 返回子串从何处开始,取多长
console.log(url.substring(7, 10)) // 返回子串,从何处开始,到什么为止
#-----------------------------------------------------
[ 'www', 'magedu', 'com' ]
ed
edu
let s = 'magedu.edu'
console.log(s.indexOf('ed')) // 3
console.log(s.indexOf('ed', 4)) // 7
console.log(s.replace('.edu', '.com'))
s = ' \tmag edu \r\n'
console.log(s.trim()) // 去除两端的空白字符。trimLeft、trimRight是非标函数,少用
#---------------------------------------------------------------------------------------------------------
3
7
magedu.com
mag edu
6. 数值型number
在JS中,数据均为双精度浮点型范围只能在 -(2^53 -1) 和 2^53 -1之间,整型也不例外。
数字类型还有三种符号值:+Infinity(正无穷)、-Infinity(负无穷)和 NaN (not-a-number非数字)。
二进制0b0010、0B110。
八进制0755。注意0855,将被认作十进制,因为8不在八进制中。ES6中最好使用0o前缀表示八进制。
十六进制0xAA、0Xff。
指数表示1E3(1000),2e-2(0.02)
常量属性
var biggestNum = Number.MAX_VALUE; //
var smallestNum = Number.MIN_VALUE;
var infiniteNum = Number.POSITIVE_INFINITY; // 正无穷
var negInfiniteNum = Number.NEGATIVE_INFINITY; // 负无穷
var notANum = Number.NaN;