算术运算符,用Ruby的Lambda实现基本数值运算

TWO = -> p { -> x { p[p[x]] } }THREE = -> p { -> x { p[p[p[x]]] } }FOUR = -> p { -> x { p[p[p[p[x]]]] } }# ....

递减(–)

  递减–运算符的操作数也是一个左值,它通过Number()转型函数把操作数调换为数字,然后减1,并将计算后的值重新赋值给操作数

  和递增++运算符同样,递减–运算符的再次回到值重视于它相对操作数的岗位,当递减运算符在操作数从前,操作数减1并重临减1之后的值。当递减运算符在操作数之后,操作数减1并回到减1在此之前的值

var age = 29;
--age;
//相当于
var age = 29;
age = age - 1;

  前增量操作符与实行语句优先级同样,整个语句会从左向右求值

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//21
var num4 = num1 + num2;//21

  后增量操作符在包蕴它们的言语被求值之后才施行

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//22
var num4 = num1 + num2;//21

  在论及++和–运算符时,假诺将其充作后缀表达式,它和表达式应该同一行。不然,行尾将补偿分号,同一时间++或–将用作下一行代码的前缀操作符并与之一同深入分析

x
--
y

  javascript将其深入分析为:

x;--y;

  而代码的原意是:

x--;y;

 

但若是要创设四个前后相继,仅只有那个骨干的数据类型是远远不够的。比比较多时候大家会想对我们转换的那一个数字做些无聊的操作。比如大家常用的加法,减法,乘法,以及阶乘等等。上边我们就来贯彻那么些操作。

除法(/)

  除法操作符由叁个斜线(/)表示,施行第叁个操作数除以第二个操作数的演算,也会经过Number()转型函数将非数值类型转换为数值或NaN

Infinity / Infinity;//NaN
0 / 0;//NaN
非0数值 / 0;//Infinity或-Infinity
Infinity / 0;//Infinity
Infinity / 非0数值;//Infinity

 

古代人云:“温故而知新,可感到师矣”。那么伊始落实基本数值运算此前大家先来温习一下事先的知识,顺手落成多少个邱奇数

乘法(*)

  乘法操作符由三个星号(*)表示,用于总结两个数值的乘积,会因而Number()转型函数将非数值类型调换为数值或NaN

+ Infinity * 0;//NaN
- Infinity * 0;//NaN
Infinity * 非0数值;//Infinity或-Infinity
Infinity * Infinity;//Infinity

 

就好像有个别意思,那这里作者姑且命名这些函数为SUCC

参谋资料

【1】 ES5/表达式
【2】 阮一峰Javascript标准参照教程——基本语法之运算符
http://javascript.ruanyifeng.com
【3】 W3School-Javascript高档教程——ECMAScript运算符
http://www.w3school.com.cn
【4】《javascript权威指南(第6版)》第4章 表明式和平运动算符
【5】《javascript高档程序设计(第3版)》第3章 基本概念
【6】《javascript语言美丽(修订版)》第2章 语法

 

SUCC = -> n { -> p { -> x { p[n[p][x]] } }}

一元加(+)

  一元加运算符以二个加号(+)表示,放在数值后面,对数值不会生出其余影响

var num = 25;
num = +num; //25

  在对非数值应用一元加运算符时,会调用Number()转型函数对那一个值举行转移

var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var b = false;
var f = 1.1;
var o = {
    valueOf:function(){
        return -1;
    }
};

s1 = +s1;//1
s2 = +s2;//1.1
s3 = +s3;//NaN
b = +b;//0
f = +f;//1.1
o = +o;//-1

  [注意]在new
Date()前边使用一元加符号,能够把日子字符串,调换为日期飞秒数

console.log(new Date());//on Jul 11 2016 20:25:54 GMT+0800 (中国标准时间)
console.log(+new Date());//1468239954076

 

说爱他美(Aptamil)下结果是不是科学

递增(++)

  递增++运算符对其操作数举办增量(加1)操作,操作数是四个左值(lvalue)(变量、数组成分或对象属性)。运算符通过Number()转型函数将操作数转换为数字,然后给数字加1,并将加1后的数值重新赋值给变量、数字成分或许指标属性

var age = 29;
++age;
//相当于
var age = 29;
age = age +1;

  递增++运算符的重回值信任于它相对于操作数的位置。当运算符在操作数从前,称为前增量(pre-increment)运算符,它对操作数举行增量总结,并重返计算后的值。当运算符在操作数之后,称为后增量(post-increment)运算符,它对操作数进行增量总结,但回到未做增量总括的(unincremented)值

  不管是前增量如故后增量,这么些运算符平日用在for循环中,用于调整循环内的计数器

var i = 1, j = ++i;//i=2 j=2
var i = 1, j = i++;//i=2 j=1

  [注意]++x并不总是和x =
x+1完全同样,++运算符从不进行字符串连接操作,它总是会将操作数转变为数字并增1

var x = '1';
++x;//2
var x = '1';
x = x + 1;//'11'

 

永利集团304com 1Calculator

二元算术运算符

  二元算术运算符包含加法(+)、减法(-)、乘法(*)、除法(/)和求余(%)

 

教师:
大家用到了作者们早就达成的SUCC函数,从字面上来驾驭正是我们从基础数m发端,不断递增自个儿,当递增n次的时候大家就能够获取n + m的结果了。假诺拆开来看会尤其显眼,大家当nTHREEmTWO的时候,代入函数,便可获得这么二个表明式SUCC[SUCC[SUCC[TWO]]],其实正是把TWO递增3次,最终会获得FIVE

加法(+)

  在许多程序设计语言中,加法平常是简约的数字运算符,但在ECMAScript中,加法运算有雅量的特别表现,不仅可以够扩充数值加法运算,也可以实行字符串连接

  加法运算服从如下准则:

  【1】如若中间七个操作数是目的,则对象会退换为原始值:日期对象通过toString()方法推行调换,其余对象通过valueOf()方法实施转换。由于大多数指标valueOf()方法不能回到贰个原始值,于是会通过toString()方法来实行转换

  [注意]除此而外单数值数组会调换为数字外,其余原生对象都会透过toString()方法转变为字符串形式

  【2】在拓宽了对象到原始值的转移后,假使内部三个操作数是字符串的话,另一个操作数也会转换到字符串,进行字符串连接

  【3】不然,多少个操作数都将转变来数字或NaN,举办加法操作

//单数值数组和valueOf()返回值为数值的自定义对象会转换为数值
console.log(1 + []);//1
var o = {
    valueOf: function(){
        return -1;
    }
}
console.log(1 + o);//0

//其他原生对象则转换为字符串
console.log(1 + {});//'1[object Object]'
console.log(1 + [1,2]);//'11,2'
console.log(1 + new Date());//'1Thu Jun 16 2016 10:27:13 GMT+0800 (中国标准时间)'
console.log(1 + /0/);//'1/0/'

  假诺举办算术加法运算,undefined变换为NaN,null转变为0,false转变为0,true转变为1

console.log(undefined + undefined);//NaN
console.log(null + null);//0
console.log(false + false);//0
console.log(true + true);//2

  要是进展字符串连接,undefined调换为’undefined’,null调换为’null’,false转换为’false’,true转换为’true’

console.log('' + undefined);//'undefined'
console.log('' + null);//'null'
console.log('' + false);//'false'
console.log('' + true);//'true'

  由此,利用加号运算符的特征,能够应用”+大肆类型值转变为字符串

  在数字加法运算中,Infinity和带符号的0的管理相比较特别

Number.MAX_VALUE + Number.MAX_VALUE === Infinity;//true
Infinity + (-Infinity);//NaN
+0 + (-0) === +0;//true

 

MULTI = -> n { -> m { n[ADD[m]][ZERO] }}

减法(-)

  相对于加法,减法就大约的多,只关乎到数字的减法运算。使用Number()转型函数将非数值类型转换为数值或NaN

console.log(1 - {});//NaN
console.log(1 - [1,2]);//NaN
console.log(1 - /0/);//NaN
console.log(1 - []);//1

  加法有多少个异样之处,在于时间Date对象举行加法运算时选拔toString()转变为字符串,而在其余数学生运动算,满含减法、乘法、除法、求余等运算中,都以运用Number()转换函数将时间Date对象使用valueOf()转换为数字

console.log(new Date() + 1);//'Thu Jun 16 2016 11:11:49 GMT+0800 (中国标准时间)1'
console.log(new Date() - 1);//1466046941641

  undefined转换为NaN,null转换为0,false转换为0,true转换为1

console.log(1 - undefined);//NaN
console.log(1 - null);//1
console.log(1 - false);//1
console.log(1 - true);//0

 

这不就是加法的面目吗?咱俩把多少个数m,n相加,
其实就一定于在m的基础上做了n加一操作罢了。
只是这么些进程太平时了,平时到我们大概发掘不到它的留存。

求模(%)

  求模(余数)操作符是由贰个百分号(%)表示,是第一个操作数除以第一个操作数的余数

//r是余数,n是被除数,d是除数,
//q是整数,在n/d为负时为负,在n/d为正时为正,它应该在不超过n和d的商的前提下尽可能大
r = n - (d * q)

  求模结果与第贰个操作数的暗记保持一致

console.log(5 % 2);//1
console.log(5 % -2);//1
console.log(-5 % 2);//-1
console.log(-5 % -2);//-1

  被除数是Infinity,或除数是0,则求模结果是NaN

Infinity % 0 = NaN
Infinity % Infinity = NaN
Infinity % 非0数值 = NaN
非0数值 % 0 = NaN

  在大好些个编程语言中,求模运算符只接受整数为操作数,而在ECMAScript中,还收受浮点操作数,但由于浮点数不是典型的值,不可能获取完全标准的结果

console.log(6.5 % 2.1);//0.19999999999999973

 

F => TWOF => THREEF => FOUR

一元减(-)

  一元减运算符主要用来表示负数

var num = 25;
num = -num;//-25

  当一元减运算符用于非数值时,会对该值使用Number()转型函数进行更动,再将获取的数值转变来负数

var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var b = false;
var f = 1.1;
var o = {
    valueOf:function(){
        return -1;
    }
};

s1 = -s1;//-1
s2 = -s2;//-1.1
s3 = -s3;//NaN
b = -b;//0
f = -f;//-1.1
o = -o;//1

  [注意]一元加和一元减运算符首要用于着力的算术运算,也得以用于转移数据类型

 

热身里面好像隐形了一部分事物,大家平日所定义的多少个数字,其本质正是在0的底子上实践
加一操作得到的,大家想要什么数字就实施稍微次加一操作,而以此时候我们的开头值是0。那么只要初阶值不是0啊?那会发出哪些业务?

一元算术运算符

  一元算术运算符用于一个单身的操作数,并爆发二个新值。在javascript中,一元运算符具备异常高的优先级,並且都以右结合(right-associative)

  一元算术运算符包涵一元加法(+)、一元减法(-)、递增(++)和递减(–)

 

查看一下结实

眼前的话

  javascript中的算术操作首要通过算术运算符来实现,本文将介绍算术运算符的剧情。算术运算符包涵一元算术运算符和二元算术运算符三种

 

ADD = -> n { -> m { n[SUCC][m] }}

一经再三调用p咱们便可见创设更加大的邱奇数,那么大家是否能够创设七个函数来形成这些永利集团304com,几度调用p的历程吧?小编期望的函数是如此专门的学业的

更多的邱奇数

2) 滑动窗口

微型Computer互连网之中有过那样一个概念。情势上通晓便是

[ 1 2 ] 3 4 5 61 [ 2 3 ] 4 5 61 2 [ 3 4 ] 5 61 2 3 [ 4 5 ] 61 2 3 4 [ 5 6 ]

那能见到哪些?在中括号括起来的地点不就是我们稳步对吗?上边这些滑动窗口,其实我们能够用有序对来效仿。当最早值设置为的时候滑动3次就能够有如下效果

[0, 0][0, 1][1, 2][2, 3]

有一点点像是我们前边定义的SUCC形式,只是大家那时只操作三个邱奇数,重返一个邱奇数。而在此地大家是传播叁个PAIR,
然后重回那么些PAIR向右滑动的结果。

那大家尝试编写那个函数

SLIDE = -> p { PAIR[p[RIGHT]][SUCC[p[RIGHT]]]}

传授学识:
该函数接受壹个PAIR用作参数,然后成立一个新的PAIR,以原来PAIR的右边的成分作为新PAIR的左边手的要素。而新PAIR左侧的因素用的是本来PAIR左手元素递增之后的值。

在验证那一个方法无误性在此之前小编还供给贯彻to_pair本条点子,用来便于大家对PAIR剧情的反省

def to_pair "(#{to_integer(pair[LEFT])}, #{to_integer(pair[RIGHT])})"end

>> puts to_pair(PAIR[ONE][TWO])>> puts to_pair(SLIDE[PAIR[ONE][TWO]])>> puts to_pair(SLIDE[SLIDE[PAIR[ONE][TWO]]])

哈哈,SLIDE的表现已经跟我们的预期同样了。

def to_integer n[-> x {x + 1}][0]end

>> to_integer => 1>> to_integer => 0

发表评论

电子邮件地址不会被公开。 必填项已用*标注